C# Winform节点拖拽

需求:支持ListView节点拖拽至TreeView,TreeView节点拖拽至ListView,TreeView节点拖拽至TreeView

实现方案:需以下三个事件联合使用
1.源控件的ItemDrag事件
2.目标控件的DragEnter事件
3.目标控件的DragDrop事件

 #region ListView节点拖拽至TreeView
        private void TlvDwgInfos_ItemDrag(object sender, ItemDragEventArgs e)
        {
            //判断是否是鼠标右键按动
            if (e.Button == MouseButtons.Left)
            {
                OneKeyForm.DoDragDrop(OneKeyForm.tlvDwgInfos.CheckedItems, DragDropEffects.Move);
            }
        }
        private void MstvPrjInfos_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(CheckedListViewItemCollection))
                || e.Data.GetDataPresent(typeof(List<TreeNode>)))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
        private void MstvPrjInfos_DragDrop(object sender, DragEventArgs e)
        {
            //if (TreeNodeLst.Count > 0 && SelectedNode != OneKeyForm.mstvPrjInfos.SelectedNode)
            //{
            //    TreeNodeLst.ForEach(n => n.Remove());
            //    TreeNodeLst.Clear();
            //    SelectedNode.ImageIndex = 0;
            //    SelectedNode.SelectedImageIndex = 0;
            //}
            //根据鼠标坐标确定要移动到的目标节点
            Point pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            SelectedNode = OneKeyForm.mstvPrjInfos.GetNodeAt(pt);
            if (SelectedNode != null)
            {
                ProjectFolderDTO folderDTO = SelectedNode.Tag as ProjectFolderDTO;
                if (folderDTO != null)
                {
                    if (e.Data.GetDataPresent(typeof(CheckedListViewItemCollection)))
                    {
                        CheckedListViewItemCollection checkedlvItemColl = (CheckedListViewItemCollection)
                            e.Data.GetData(typeof(CheckedListViewItemCollection));
                        List<ListViewItem> lvItemLst = new List<ListViewItem>();
                        foreach (ListViewItem tlvItem in checkedlvItemColl)
                        {
                            string nodeText = tlvItem.Text;
                            TreeNode node = new TreeNode(nodeText);
                            string splitDwgCode = Path.GetFileNameWithoutExtension(nodeText);
                            string strHasUpdate = ServerProjectData.HasSplitDwgUpdate(folderDTO.ID, splitDwgCode);
                            if (Boolean.Parse(strHasUpdate))
                            {
                                node.ForeColor = Color.Red;
                            }
                            node.ImageIndex = 2;
                            node.SelectedImageIndex = 2;
                            node.Tag = tlvItem.Tag;
                            node.Name = tlvItem.Text;
                            if (TreeNodeLst.FindIndex(n => n.Text == node.Text) == -1)
                            {
                                SelectedNode.Nodes.Add(node);
                                TreeNodeLst.Add(node);
                            }
                            lvItemLst.Add(tlvItem);
                        }
                        SelectedNode.ImageIndex = 1;
                        SelectedNode.SelectedImageIndex = 1;
                        SelectedNode.Expand();
                        lvItemLst.ForEach(i => i.Remove());
                    }
                    else if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
                    {
                        List<TreeNode> selectedNodes = e.Data.GetData(typeof(List<TreeNode>)) as List<TreeNode>;
                        List<TreeNode> moveNodeParLst = new List<TreeNode>();
                        foreach (TreeNode node in selectedNodes)
                        {
                            if (!moveNodeParLst.Contains(node.Parent))
                            {
                                moveNodeParLst.Add(node.Parent);
                            }
                            OneKeyForm.mstvPrjInfos.Nodes.Remove(node);
                            SelectedNode.Nodes.Add(node);
                        }
                        foreach (TreeNode moveNodePar in moveNodeParLst)
                        {
                            if (moveNodePar.Nodes.Count == 0)
                            {
                                moveNodePar.ImageIndex = 0;
                                moveNodePar.SelectedImageIndex = 0;
                            }
                        }
                        SelectedNode.ImageIndex = 1;
                        SelectedNode.SelectedImageIndex = 1;
                        SelectedNode.Expand();
                    }
                    Describes();
                }
            }
            OneKeyForm.tlvDwgInfos.Refresh();
            OneKeyForm.mstvPrjInfos.Refresh();
        }
#endregion

#region TreeView节点拖拽至ListView
        private void MstvPrjInfos_ItemDrag(object sender, ItemDragEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ArrayList selectedNodes = OneKeyForm.mstvPrjInfos.SelectedNodes;
                if (selectedNodes != null && selectedNodes.Count > 0)
                {
                    List<TreeNode> resNodeLst = new List<TreeNode>();
                    foreach (TreeNode node in selectedNodes)
                    {
                        FrameTemplate frameTemp = node.Tag as FrameTemplate;
                        if (frameTemp != null)
                        {
                            resNodeLst.Add(node);
                        }
                    }
                    OneKeyForm.DoDragDrop(resNodeLst, DragDropEffects.Move);
                }
            }
        }
        private void TlvDwgInfos_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
        private void TlvDwgInfos_DragDrop(object sender, DragEventArgs e)
        {
            //获得拖放中的节点
            List<TreeNode> moveNodes = (List<TreeNode>)e.Data.GetData(typeof(List<TreeNode>));
            List<TreeNode> moveNodeParLst = new List<TreeNode>();
            foreach (TreeNode moveNode in moveNodes)
            {
                FrameTemplate frameTemplate = moveNode.Tag as FrameTemplate;
                if (frameTemplate != null)
                {
                    if (!moveNodeParLst.Contains(moveNode.Parent))
                    {
                        moveNodeParLst.Add(moveNode.Parent);
                    }
                    ListViewItem lvItem = new ListViewItem(moveNode.Text);
                    lvItem.Tag = moveNode.Tag;
                    lvItem.ImageIndex = 2;
                    lvItem.SubItems.Add(frameTemplate.LayoutName);
                    OneKeyForm.tlvDwgInfos.Items.Add(lvItem);
                    OneKeyForm.mstvPrjInfos.Nodes.Remove(moveNode);
                    TreeNodeLst.RemoveAll(t => t.Text.Contains(moveNode.Text));
                }
            }
            foreach (TreeNode moveNodePar in moveNodeParLst)
            {
                if (moveNodePar.Nodes.Count==0)
                {
                    moveNodePar.ImageIndex = 0;
                    moveNodePar.SelectedImageIndex = 0;
                }
            }
            OneKeyForm.mstvPrjInfos.Refresh();
            Describes();
        }
        #endregion
#region  DragOver事件  实现拖拽至目标节点,目标节点高亮显示
 private void MstvPrjInfos_DragOver(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(SelectedListViewItemCollection)))
            {
                //根据鼠标坐标确定要移动到的目标节点
                Point pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
                TreeNode targeNode = OneKeyForm.mstvPrjInfos.GetNodeAt(pt);
                OneKeyForm.mstvPrjInfos.HideSelection = false;
                OneKeyForm.mstvPrjInfos.SelectedNode = targeNode;
                OneKeyForm.mstvPrjInfos.SelectedNode.ForeColor = SystemColors.HighlightText;
                OneKeyForm.mstvPrjInfos.SelectedNode.BackColor = SystemColors.Highlight;
                OneKeyForm.mstvPrjInfos.HideSelection = true;
            }
        }
#endregion
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值