TreeView控件中实现拖拽的功能

简介:   #region 节点拖拽事件        //当用户开始拖动节点时        private void tvModel_ItemDrag(object sender, ItemDragEventArgs e)        {            TreeNode selectNode = e.

 

#region 节点拖拽事件
         // 当用户开始拖动节点时
         private  void tvModel_ItemDrag( object sender, ItemDragEventArgs e)
        {
            TreeNode selectNode = e.Item  as TreeNode;
             this.tvModel.SelectedNode = selectNode;

             this.form.DoDragDrop(e.Item, DragDropEffects.Move);
        }

         // 将对象拖入控件的边界时
         private  void tvModel_DragEnter( object sender, DragEventArgs e)
        {
            TreeNode enterNode = (TreeNode)(e.Data.GetData( typeof(TreeNode)));
             if (enterNode !=  null)
                e.Effect = DragDropEffects.Move;
             else
                e.Effect = DragDropEffects.None;
        }

         // 在完成拖放操作时
         private  void tvModel_DragDrop( object sender, DragEventArgs e)
        {
            TreeNode selectNode = (TreeNode)(e.Data.GetData( typeof(TreeNode)));

             // 0.如果选择源为空 或者不是二级节点则退出
             if (selectNode ==  null || selectNode.Level !=  1)
                 return;

             // 1.根据鼠标坐标获得目标节点
            Position.X = e.X;
            Position.Y = e.Y;
            Position =  this.tvModel.PointToClient(Position);
            TreeNode targetNode =  this.tvModel.GetNodeAt(Position);
             foreach (TreeNode node  in  this.tvModel.Nodes[ 0].Nodes)
                node.NodeFont =  new Font( this.form.Font, FontStyle.Regular);

             // 2.获得要插入的目标节点索引
             int index =  0;
             if (targetNode ==  null)
                index = selectNode.Parent.Nodes.Count -  1;       // 目标节点为null, 直接插入到最后
             else  if (targetNode.Level ==  1)
                index = targetNode.Index +  1;                    // 目标节点为同级, 直接在之后插入
             else  if (targetNode.Level ==  0)
                index =  0;                                       // 目标为根节点, 直接插入到最前
             else  if (targetNode.Level >  1)
            {                                                    // 目标节点为二级节点以后, 遍历到其二级节点
                 while (targetNode.Level >  1)
                    targetNode = targetNode.Parent;
                index = index = targetNode.Index +  1;
            }

             // 3.源节点删除, 目标节点在索引出插入, 并高亮选中
            selectNode.Remove();
             this.tvModel.Nodes[ 0].Nodes.Insert(index, selectNode);
             this.tvModel.SelectedNode = selectNode;
        }

         // 将对象拖过控件边缘时
         private  void tvModel_DragOver( object sender, DragEventArgs e)
        {
            Position.X = e.X;
            Position.Y = e.Y;
            Position =  this.tvModel.PointToClient(Position);

             // 在拖过的控件前后显示划线效果
            TreeNode targetNode =  this.tvModel.GetNodeAt(Position);
             if (targetNode !=  null && targetNode.Level ==  1)
            {
                 if (targetNode.PrevNode !=  null)
                    targetNode.PrevNode.NodeFont =  new Font( this.form.Font, FontStyle.Regular);
                 if (targetNode.NextNode !=  null)
                    targetNode.NextNode.NodeFont =  new Font( this.form.Font, FontStyle.Regular);
                targetNode.NodeFont =  new Font( this.form.Font, FontStyle.Underline);
            }
        }
         #endregion

 

目录
相关文章
|
监控 关系型数据库 MySQL
MySQL 5.7在高并发下性能劣化问题的详细剖析
TL;DR MySQL 5.7高并发读写混合场景下rt飙升,业务系统大量超时报错。本文总结了阿里业务场景下遇到的坑,剖析问题背后的原因,帮助读者更好的理解MySQL内核原理,降低升级MySQL 5.7的风险。
10082 0
|
Linux API 数据安全/隐私保护
|
2月前
|
机器学习/深度学习 人工智能 负载均衡
在 Ray Data 和 Ray Serve 中推出原生 LLM API
https://www.anyscale.com/blog/llm-apis-ray-data-serve 译文
|
9月前
|
人工智能 搜索推荐 数据挖掘
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
原生鸿蒙版小艺APP成功接入DeepSeek-R1,为HarmonyOS用户带来更智能高效的交互体验。通过此次升级,用户在编程、学习和工作中的问题可迅速获得专业解答。同时,此举为HarmonyOS应用开发者提供了新的技术参考,激发了更多创新应用场景的开发,助力打造差异化竞争优势,推动HarmonyOS生态繁荣发展。
845 68
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
文科生在AI大模型时代:以人文为翼,迎接新机遇
随着AI大模型的崛起,关于“文科无用论”的讨论再度兴起。然而,AI在内容创作中的优势并未使文科生陷入就业寒冬,反而带来了新机遇。AI大模型依赖高质量的人文训练语料,文科生可在模型训练、优化及新兴职业如AIGC内容官中发挥专长。掌握AI技能并通过GAI认证,文科生能在新时代绽放光彩。
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
1185 0
|
存储 JSON API
随机图片API源码(附新图片数据
含1000+HTTP图片,存储于企业空间,速度媲美新浪。计划扩展更多类别。基础调用:`http:///dm`,JSON格式:`http:///dm?return=json`。返回示例: ```json {
295 0
|
SQL 消息中间件 Java
SpringBoot 实现 Excel 导入导出,百万数据量,性能爆表!
SpringBoot 实现 Excel 导入导出,百万数据量,性能爆表!
|
SQL 存储 数据库连接
如何使用 FreeSql 无缝接替 EF Core ?
在使用 `EF Core` 作为默认的 `ORM` 工具操作数据库时,项目中我们或许只能接触到 `DbContext` 对象,没法直接获取 `db` 数据库连接信息,假如有小伙伴想接入 `FreeSQL` 继续使用熟悉的模式,那该怎么办呢?此时我们可以这样操作,为了不影响原有项目结构的操作,又想接入 `FreeSQL` 的小伙伴们,通过上面的方式我们就可以使用 `FreeSQL` 无缝替换 `EF Core`。
462 1
如何使用 FreeSql 无缝接替 EF Core ?