• C#guanli


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Runtime.InteropServices;
    using System.IO;
    
    namespace ResourceManage
    {
    
        #region 设置双缓存,是屏幕不会闪烁
        class ListViewNF : System.Windows.Forms.ListView
        {
            public ListViewNF()
            {
                //开启双缓存
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                    ControlStyles.AllPaintingInWmPaint, true);
    
                this.SetStyle(ControlStyles.EnableNotifyMessage, true);
            }
    
            protected override void OnNotifyMessage(Message m)
            {
                if (m.Msg != 0x14)
                {
                    base.OnNotifyMessage(m);
                }
            }
        };
        #endregion
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            #region 定义的变量
            //自定义的文件操作类
            ManageFile clManageFile = new ManageFile();
            //ManageThread clManageThread = new ManageThread();
    
            //记录listview中items的集合
            private List<ListViewItem> ItemsSource = new List<ListViewItem>();
            ListViewItem[] CurrentCacheItemSource;
    
            //记录选中的TreeView节点
            TreeNode tNode;
    
            //记录Thread中sleep前后的list的count值
            int iLoopx = 0;
            int iLoopy = 0;
            List<int> list = new List<int>();
    
            //记录线程二是否开始
            bool bSecondThread = true;
    
            //记录线程一是否开始
            bool bFirstThread = true;
    
            //定义线程二
            Thread threadSecond;
    
            //定义线程一
            Thread threadFirst;
    
            //记录选中的文件夹的路径集合
            List<string> listStr = new List<string>();
            private delegate void FlushClient();//代理 
    
            //记录TreeView节点的路径
            string strTreeViewFilePath;
            #endregion       
    
            
            #region 页面事件
            //页面加载
            private void Form1_Load(object sender, EventArgs e)
            {
                //
                clManageFile.GetImageList(ref imageList1);
    
                //非递归绑定节点
                clManageFile.BandTreeViewNodeNo(tvTreeView);
    
                //对线程使用的设置
                Control.CheckForIllegalCrossThreadCalls = false;
    
                //自定义两个线程
                threadSecond = new Thread(new ThreadStart(threadFunSecond));
                threadSecond.IsBackground = false;
                threadFirst = new Thread(new ThreadStart(CrossThreadFlush));
                threadFirst.IsBackground = false;
    
                //
                clManageFile.IFileNum = 0;
            }
            
            //重写关闭事件
            protected override void OnClosed(EventArgs e)
            {
                threadFirst.Abort();
                threadSecond.Abort();
                base.OnClosed(e);
            }
            #endregion
    
    
            #region TreeView点击事件
    
            //右键选择中Item项
            private void tvTreeView_MouseClick(object sender, MouseEventArgs e)
            {
                if (e.Button == System.Windows.Forms.MouseButtons.Right)
                {
                    tvTreeView.SelectedNode = tNode;
                }
                if(e.Button == System.Windows.Forms.MouseButtons.Left)
                {
    
                    if (CurrentCacheItemSource != null)
                    {
                        strPath = (CurrentCacheItemSource[iIndex].Name);
                    }
                }
            } 
    
            //单击TreeView节点
            private void tvTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                tNode = e.Node;
            }
    
            //TreeView节点获得焦点
            private void tvTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
            {
                //必须设置,否则影响过滤任务
                lvListView.SelectedIndices.Clear();
                lvListView.VirtualMode = false;
    
                //用于过滤无效任务
                try
                {
                    Monitor.Enter(list);
                    list.Add(1);
                }
                finally
                {
                    Monitor.Exit(list);
                }
    
                //开启两个线程
                if (bSecondThread)
                {
                    threadSecond.Start();
                    threadFirst.Start();
                    bSecondThread = false;
                }
    
                //获得点击的treenode
                tNode = e.Node;
                e.Node.Checked = true;
            }
    
            //点击节点前的加号
            private void tvTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
            {
                clManageFile.FirstBandNodeNo(e.Node);
            }
            #endregion
    
            #region TreeView修改文件名
    
            //进入修改之前
            private void tvTreeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
            {
                if (e.Node.Parent == null)
                {
                    e.Node.EndEdit(true);
                }
            }
    
            //修改完成
            private void tvTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
            {
                strTreeViewFilePath = e.Node.Name;
                if (null != e.Label)
                {
                    //进行文件夹名字的修改
                    clManageFile.UpdataFileName(strTreeViewFilePath, e.Label, ref tNode);
                    clManageFile.FirstBandNodeNo(tNode);
                    //tvTreeView.Focus();
                    threadFunFirst();
                    tvTreeView.SelectedNode = tNode;
                }
            } 
    
            #endregion
    
            #region TreeView右键功能
            //新增文件夹
            private void AddtoolStripMenuItemTreeView_Click(object sender, EventArgs e)
            {
    
            }
    
            //修改文件夹
            private void UpdatatoolStripMenuItemTreeView_Click(object sender, EventArgs e)
            {
                tvTreeView.SelectedNode.BeginEdit();
            }
    
            //删除文件夹
            private void DeltoolStripMenuItemTreeView_Click(object sender, EventArgs e)
            {
    
            }
    
            //复制文件夹
            private void CopytoolStripMenuItemTreeView_Click(object sender, EventArgs e)
            {
    
            }
    
            //粘贴文件夹
            private void PlasttoolStripMenuItemTreeView_Click(object sender, EventArgs e)
            {
    
            }
            #endregion
    
    
            #region ListView点击事件
    
            ListViewItem item = new ListViewItem();
    
            //双击ListView中item打开此文件目录的内容
            private void lvListView_DoubleClick(object sender, EventArgs e)
            {
            }
    
            //获得多个有焦点的文件的路径
            private void lvListView_MouseClick(object sender, MouseEventArgs e)
            {
                //iIndex = lvListView.SelectedIndices[0];
    
                item = lvListView.GetItemAt(e.X, e.Y);
    
                strPath = item.Name;
            } 
    
            #endregion
    
            #region ListView修改文件名
    
            string strPath = "";
            int iIndex = 0;
            private void lvListView_BeforeLabelEdit(object sender, LabelEditEventArgs e)
            {
    
            }
            //记录文件修改之后的名称
            string strLable = "";
            //对文件名进行修改之后
            private void lvListView_AfterLabelEdit(object sender, LabelEditEventArgs e)
            {
                strLable = e.Label;
                Thread thread = new Thread(new ThreadStart(UpFileNameThread));
                thread.IsBackground = false;
                thread.Start();
                clManageFile.FirstBandNodeNo(tNode);
                tNode.Expand();
            }
    
            private void UpFileNameThread()
            {
                firstItem = 0;
                clManageFile.UpdataFileName(strPath, strLable);
                if (this.InvokeRequired)
                {
                    this.BeginInvoke(new EventHandler(DelRefresh));
                }
                else
                {
                    DelRefresh(null, null);
                }
            }
            private void DelRefresh(object sender, EventArgs e)
            {
                this.lvListView.VirtualListSize = ItemsSource.Count;
                this.lvListView.Refresh();
            }
            #endregion
    
            #region ListView右键功能
    
            //新增文件夹
            private void AddToolStripMenuItem_Click(object sender, EventArgs e)
            {
                lvListView.VirtualMode = false;
                string strNewFilePath = "";
                clManageFile.AddFileName(tNode.Name, "新建文件夹", ref strNewFilePath);
                ///AgainBand();
                //foreach(ListViewItem items in lvListView.Items)
                //{
                //    if (items.Name == strNewFilePath)
                //    {
                //        items.Selected = true;
                //        break;
                //    }
                //}
            }
    
            //删除文件夹
            private void DelToolStripMenuItem_Click(object sender, EventArgs e)
            {
                foreach (string strDelFileName in listStr)
                {
                    clManageFile.DelFileName(strDelFileName);
                }
                AgainBand();
            }
    
            //修改文件夹
            private void UpdataToolStripMenuItem_Click(object sender, EventArgs e)
            {
                lvListView.SelectedItems[0].BeginEdit();
            }
    
            //打开文件夹
            private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
            {
                tvTreeView.Focus();
                TreeNode tNodeOne = new TreeNode();
                clManageFile.FindTreeNode(tNode, listStr[0], ref tNodeOne);
                clManageFile.FirstBandNodeNo(tNodeOne);
                tNodeOne.Expand();
                tvTreeView.SelectedNode = tNodeOne;
            }
    
            //复制文件夹
            private void CopyToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
            }
    
            //粘贴文件夹
            private void PlastToolStripMenuItem_Click(object sender, EventArgs e)
            {
                foreach (string strPath in listStr)
                {
                    clManageFile.CopyFileName(strPath);
                }
                clManageFile.BandListViewItem(tNode, lvListView);
            }
    
            //右键的目录显示情况
            private void contextMenuStripFirst_Opening(object sender, CancelEventArgs e)
            {
                if (0 == listStr.Count)
                {
                    AddToolStripMenuItem.Enabled = false;
                    DelToolStripMenuItem.Enabled = false;
                    UpdataToolStripMenuItem.Enabled = false;
                    OpenToolStripMenuItem.Enabled = false;
                    CopyToolStripMenuItem.Enabled = false;
                    PlastToolStripMenuItem.Enabled = false;
                }
                else
                {
                    AddToolStripMenuItem.Enabled = false;
                    DelToolStripMenuItem.Enabled = false;
                    UpdataToolStripMenuItem.Enabled = false;
                    OpenToolStripMenuItem.Enabled = false;
                    CopyToolStripMenuItem.Enabled = false;
                    PlastToolStripMenuItem.Enabled = false;
                }
            } 
    
            //增删改查文件后重新绑定
            private void AgainBand()
            {
                clManageFile.BandListViewItem(tNode, lvListView);
                clManageFile.FirstBandNodeNo(tNode);
                tNode.Expand();
            }
    
            #endregion
    
            #region ListView的虚拟模式
          
            //用来记录ListView的总数据的个数
            List<string> strList = new List<string>();
    
            //用来记录标志
            private int firstItem;
    
            #region 虚拟模式的三个主要函数
            private void lvListView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
            {
                System.Diagnostics.Debug.WriteLine(e.ItemIndex);
    
                if (CurrentCacheItemSource != null && e.ItemIndex >= firstItem && e.ItemIndex < firstItem + CurrentCacheItemSource.Length)
                {
                    e.Item = CurrentCacheItemSource[e.ItemIndex - firstItem];
                }
                else
                {
                    if (e.ItemIndex < strList.Count)
                    {
                        int i = 0;
                        while(i<1)
                        {
                            string strPath = strList[e.ItemIndex];//得到路径
    
                            e.Item = clManageFile.GetItem(strPath);
                            ++i;
                        }
                    }
                    else
                    {
                        e.Item = null;
                    }
                }
            }
    
            private void lvListView_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
            {
                if (CurrentCacheItemSource != null && e.StartIndex >= firstItem && e.EndIndex <= firstItem + CurrentCacheItemSource.Length)
                {
                    return;
                }
                firstItem = e.StartIndex;
                int Length = e.EndIndex - e.StartIndex + 1;
                CurrentCacheItemSource = new ListViewItem[Length];
    
                int x = 0;
                imageList1.Images.Clear();
                for (int i = 0; i < Length; ++i)
                {
                    if (i < strList.Count)
                    {
                        string strPath = strList[i + firstItem];//得到路径
    
                        CurrentCacheItemSource[i] = clManageFile.GetItem(strPath);
                    }
                }
            }
    
            private void lvListView_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
            {
                double x = 0;
                if (Double.TryParse(e.Text, out x)) //check if this is a valid search
                {
                    x = Math.Sqrt(x);
                    x = Math.Round(x);
                    e.Index = (int)x;
                }
            } 
            #endregion
    
            private void lvListView_VirtualItemsSelectionRangeChanged(object sender, ListViewVirtualItemsSelectionRangeChangedEventArgs e)
            {
                //strPath = (CurrentCacheItemSource[iIndex].Name);
                //MessageBox.Show(strPath);
                //foreach (ListViewItem item in lvListView.SelectedItems)
                //{
                //    string str = item.Name;
                //    listStr.Add(str);
                //}
            }
    
            private bool isMouseDown = false;
    
            private void lvListView_MouseDown(object sender, MouseEventArgs e)
            {
                isMouseDown = true;
            }
    
            private void lvListView_MouseUp(object sender, MouseEventArgs e)
            {
                isMouseDown = false;
            }
    
            private void lvListView_MouseMove(object sender, MouseEventArgs e)
            {
                ListViewItem item = lvListView.GetItemAt(e.X, e.Y);
                if (item != null)
                {
                    System.Diagnostics.Debug.WriteLine(item.Text);
                }
    
                if (isMouseDown && e.Button == MouseButtons.Left)
                {
                    lvListView.AllowDrop = true;
                    List<string> strListTemp = new List<string>();
                    foreach (int iLoop in lvListView.SelectedIndices)
                    {
                        strListTemp.Add(strList[iLoop]);
                    }
    
                    lvListView.DoDragDrop(strListTemp, DragDropEffects.All);
                }
            }
    
            private string DragOverObject = null;
            private void lvListView_DragOver(object sender, DragEventArgs e)
            {
                Point p = lvListView.PointToClient(new Point(e.X, e.Y));
                ListViewItem item = lvListView.GetItemAt(p.X, p.Y);
                if (item != null)
                {
                    DragOverObject = strList[item.Index];
                    e.Effect = DragDropEffects.All;
    
                }
                else
                {
                    e.Effect = DragDropEffects.None;
                }
            }
    
            private void lvListView_DragDrop(object sender, DragEventArgs e)
            {
                string[] formats = e.Data.GetFormats();
    
                if (formats.Length > 0)
                {
                    List<string> temList = (List<string>)e.Data.GetData(formats[0]);
    
                    if (temList != null)
                    {
                        foreach (string p in temList)
                        {
                            if(DragOverObject == p)
                            {
                                DelRefresh(null, null);
                                return;
                            }
                            else if (Directory.Exists(DragOverObject))
                            {
                                clManageFile.MoveFileName(DragOverObject, p);
                            }
                            else
                            {
                                this.lvListView.VirtualListSize = ItemsSource.Count;
                                this.lvListView.Refresh();
                                return;
                            }
                        }
                    }
                }
                DelRefresh(null, null);
    
                DragOverObject = null;
                this.lvListView.Refresh();
            } 
            #endregion
    
    
            #region 线程
            //线程一的方法
            private void CrossThreadFlush()
            {
                while (true)
                {
                    if (bFirstThread)
                    {
                        continue;
                    }
                    else
                    {
                        //将代理绑定到方法 
                        FlushClient fc = new FlushClient(threadFunFirst);
                        //this.BeginInvoke(fc);//调用代理
                        lvListView.Invoke(fc);
                        bFirstThread = true;
                    }
                }
            }
    
            //线程一的方法:开启ListView的虚拟模式
            private void threadFunFirst()
            {
                //虚拟模式绑定
                strList.Clear();
                //imageList1.Images.Clear();
                if(CurrentCacheItemSource != null)
                {
                    CurrentCacheItemSource = null; 
                }
                string[] astrPath = Directory.GetFileSystemEntries(tNode.Name);
    
                foreach (string strPath in astrPath)
                {
                    if (clManageFile.IsHidden(strPath))
                    {
                        continue;
                    }
                    strList.Add(strPath);
                }
                lvListView.VirtualListSize = strList.Count;
                lvListView.VirtualMode = true;
            }
    
            //线程二的方法:控制线程一
            private void threadFunSecond()
            {
                while (true)
                {
                    try
                    {
                        Monitor.Enter(list);
                        iLoopx = list.Count;
                    }
                    finally
                    {
                        Monitor.Exit(list);
                    }
                    Thread.Sleep(100);
                    try
                    {
                        Monitor.Enter(list);
                        iLoopy = list.Count;
                    }
                    finally
                    {
                        Monitor.Exit(list);
                    }
                    if (iLoopx != iLoopy)
                    {
                        continue;
                    }
                    if (tNode != null)
                    {
                        if (tNode.Checked)
                        {
                            bFirstThread = false;
                            list.Clear();
                        }
                        else
                        {
                            continue;
                        }
                    }
                }
            }
    
            #endregion
        }
    }
    
  • 相关阅读:
    java笔记之日期相关操作
    Android笔记之察看网络状况
    Jsp之复选框的使用
    jsp之table美化
    JSP与servlet之间跳转传值
    request的get/setParameter和get/setAttribute()
    Jsp的button按钮
    使用request.getRequestDispatcher请求转发到一个页面中文乱码解决 【转】
    Servle与JSP之间的相互跳转
    java笔记之null与isEmpty()
  • 原文地址:https://www.cnblogs.com/gengyuanchao/p/2836564.html
Copyright © 2020-2023  润新知