zoukankan      html  css  js  c++  java
  • Winform下的TreeView控件的子节点鼠标拖拽功能

    场景是在南软智慧医疗医生工作站中的模板树中:

    功能为实现拖拽子节点添加到其他节点中删除自身所在位置

    首先我们要设置TreeView的AllowDrop熟悉为True,true表示该控件允许接受拖拽

    第一步在TreeView中添加事件 ItemDrag

    private void treeOpinionTemplate_ItemDrag(object sender, ItemDragEventArgs e)
            {
                if (e.Button == System.Windows.Forms.MouseButtons.Left)// 获取判断是否是鼠标左键按下操作 ALF
                {
                    TreeNode node = (TreeNode)e.Item;//获取选定拖拽节点的实例
                    if (node != null && node.Tag != null && node.Tag.GetType() == typeof(NR.PACS.Common.Entity.Model.OpinionTemplate))
                    {
                        // 初始化拖放操作。
                        NR.PACS.Common.Entity.Model.OpinionTemplate mod = (NR.PACS.Common.Entity.Model.OpinionTemplate)node.Tag;//将选择拖动的实例转换成实体数据 alf
                        DoDragDrop(e.Item, DragDropEffects.Move | DragDropEffects.Copy);//mod为拖拽携带数据
                    }
                }
            }

    下一步我们将选中TreeView,添加事件 DragEnter

    private void treeOpinionTemplate_DragEnter(object sender, DragEventArgs e)
            {
                //设置拖动效果为移动 ALF
                e.Effect = DragDropEffects.Move;
            }

    后面我们继续在TreeView中添加事件 DradDrop

    (注:我的业务是在拖拽到的目标必须为标签节点(即分类的不是内容的节点),所以在拖放结束后需要判断该目标位置的节点是内容节点还是标签节点,对应标签节点直接添加进其Nodes,内容节点则添加入上层的Nodes,此处用到区分方法为ImageIndex的值,TreeView创建的节点图片索引不一致,ImageIndex)

       private void treeOpinionTemplate_DragDrop(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode",false))
                {
                    //被拖拽的节点
                    TreeNode treeNode;
                    //拖放的目标节点
                    TreeNode TargetTreeNode;
                    //获取当前鼠标所处的位置,并将它赋值给全局变量point
                    point = ((TreeView)sender).PointToClient(new Point(e.X,e.Y));
                    //根据坐标点取得坐标点处的Node节点
                    TargetTreeNode = ((TreeView)sender).GetNodeAt(point);
                    //获取被拖动的节点
                    treeNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
                    //判断被拖动的节点与目标节点是否为同一个节点,是则不予处理
                    if (treeNode.Text != TargetTreeNode.Text)
                    {
                        //判断该目标节点是否为树节点
                        if (TargetTreeNode.ImageIndex == 0)
                        {
                            //向目标节点加入拖动节点的克隆
                            TargetTreeNode.Nodes.Add((TreeNode)treeNode.Clone());
                        }
                        else
                        {
                            //向目标节点加入拖动节点的克隆
                            TargetTreeNode.Parent.Nodes.Add((TreeNode)treeNode.Clone());
                        }
                        //移除拖动节点
                        treeNode.Remove();
                    }
    
    
                }
            }

    至此我们的功能基本就完成了,其他的可能要根据业务进行修改了

  • 相关阅读:
    万网中备份数据操作
    《C++ Primer Plus》学习笔记3
    Redhat Linux 下安装Oracle 11g R2
    Android-shareSDK
    jQuery的AJax异步訪问
    swift语言初见
    Num 36 : ZOJ 2100 [ 深度优先搜索算法 ] [ 回溯 ]
    一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度
    [Swift]LeetCode227. 基本计算器 II | Basic Calculator II
    [Swift]LeetCode225. 用队列实现栈 | Implement Stack using Queues
  • 原文地址:https://www.cnblogs.com/BARNEYROSS/p/5443722.html
Copyright © 2011-2022 走看看