c# winform TreeView与ListView的项互相拖动的应用

   

很久没写教程了,停顿了有两年之久了。今天我们来讨论讨论 winform 中TreeView与ListView,通观两者很相似,只是一个是树形结构,一个是列表结构。

今天自己创建的群里(2175832)有个朋友问到ListView的项如何拖动到TreeView中,并生成子节点,签于麻烦,我回答比较麻烦,用BUTTON实现吧,但他觉得拖动比较方便,那当然哦!无奈帮人帮到底,送佛送到西,于是立即创建本地WINFORM 测试项目,给了点代码给他(其实他本身已经完成了一半代码量了,只是在ListView拖动项到控区域外遇到了不解之疑)

好了,废话不多说了,直接转正题吧。今天我帖了代码是两个功能的结合:
1、ListView项拖动到TreeView
2、TreeView节点项拖动到ListView中

(效果图)

主要代码实现如下:

       #region 将LISTVIEW项拖动TREEVIEW中

        /// <summary>
        /// 对选中项指定Move的“开始拖动操作”
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
        {
            this.DoDragDrop(e.Item,DragDropEffects.Move);
        }

        private void listView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect=DragDropEffects.Move;
        }

        private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            //判定是否现在拖动的数据是LISTVIEW项
            ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
            if (lvi != null)
            {
                e.Effect = DragDropEffects.Move;
            }
            else
                Cursor = Cursors.No;

        }
        private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            //获得拖放中的项
            ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem));

            //根据鼠标座标确定要移动到的目标节点
            Point pt;
            TreeNode targeNode;
            pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode = this.treeView1.GetNodeAt(pt);
            TreeNode NewMoveNode  =new TreeNode(lvi.Text);
            if(targeNode!=null)//如果目标节点未选中,则添加到一级节点
            {
                targeNode.Nodes.Add(NewMoveNode);
                //更新当前拖动的节点选择
                treeView1.SelectedNode = NewMoveNode;
                //展开目标节点,便于显示拖放效果
                targeNode.Expand();
                treeView1.Refresh();
            }
            else
            {
                this.treeView1.Nodes.Add(NewMoveNode);
                //更新当前拖动的节点选择
                treeView1.SelectedNode = NewMoveNode;
                //展开目标节点,便于显示拖放效果
                treeView1.ExpandAll();
                treeView1.Refresh();
            }
           
        }
        #endregion
       #region 将treeView的项拖动到ListView

        //定义被选择的项
        private TreeNode _selectednode;

        /// <summary>
        /// 选择treeView的项
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView2_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            try
            {
                _selectednode = e.Node;
            }
            catch { }
        }
        /// <summary>
        /// 对选中项指定Move的“开始拖动操作”
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView2_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
        {
            this.DoDragDrop(_selectednode,DragDropEffects.Move);
        }

        private void treeView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect=DragDropEffects.Move;
        }

        /// <summary>
        /// 添加MouseDown是因为,MouseDown先执行AfterSelect,所以在没有AfterSelect时,MouseDown要先选中被选取项
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView2_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            try
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    _selectednode = treeView2.GetNodeAt(e.X,e.Y);
                    treeView2.SelectedNode = _selectednode;
                }
            }
            catch { }

        }

        private void FillListView(TreeNodeCollection nodes)
        {
            for (int i = 0; i < nodes.Count; i++)
            {
                ListViewItem lvwItem = new ListViewItem(nodes[i].Text, nodes[i].ImageIndex);
                lvwItem.Tag = nodes[i].Tag;
                listView2.Items.Add(lvwItem);
            }
        }

        //当选中项移到listView的工作区时,指定被拖动的目标的移动方式
        private void listView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            try
            {
                TreeNode node = (TreeNode)e.Data.GetData(typeof(TreeNode));
                if (node != null)
                {
                    e.Effect = DragDropEffects.Move;
                }
                else
                    Cursor = Cursors.No;
            }
            catch { }
            finally { Cursor = Cursors.Default; }

        }

        //当选中项在listView在随SHU标移动时,指定被拖动的目标的移动方式
        private void listView2_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            try
            {
                if (_selectednode != null & (e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    DragDropEffects dropEffect = listView2.DoDragDrop(_selectednode, DragDropEffects.Move);
                }
            }
            catch { }

        }

        //当被放入控件时
        private void listView2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            try
            {
                TreeNode node = (TreeNode)e.Data.GetData(typeof(TreeNode));
                if (node != null)
                    listView2.Items.Add(node.Text, node.ImageIndex);
            }
            catch { }
            finally { Cursor = Cursors.Default; }
        }

        #endregion

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章