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
    }
}

 

posted on 2012-12-27 23:09  紫雨心  阅读(234)  评论(0编辑  收藏  举报

导航