#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

TreeView控件中实现拖拽的功能相关推荐

  1. 递归遍历文件夹,并添加到TreeView控件中

    遍历文件夹,并把所有节点增加到TreeView控件中,这里单独写成了一个静态类,传入根目录节点和指定的目录这两个参数即可,可以稍作扩展用于其他方案 View Code 1 using System; ...

  2. WPF 在image控件用鼠标拖拽出矩形

    今天有小伙伴问我一个问题,在image控件用鼠标拖拽出矩形,本文告诉大家如何使用鼠标画出矩形 做出来的效果先请大家看一下 最简单的方法是在 Down 的时候记录按下的点,在 移动的时候重新计算所在的宽 ...

  3. 自定义treeview控件,实现右键菜单编辑功能

    试过用复合控件包含treeview控件,但是失败,这次在右键菜单调用tree的回发js成功可以在页面后台绑定被编辑的节点,后台3个函数都可以编辑用c#传的参数e.mynode就是右键菜单的选中的节点 ...

  4. ASP.Net中的TreeView控件中对节点的上移和下移操作

    Web中的TreeView中的没有PreNode和NextNode属性. 但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点. TreeView中要么只有一个根节点:要么 ...

  5. 在 TreeView 控件中显示分层数据

    1.在web.config文件中创建以下数据库连接字符串 <connectionStrings>         <add name="NorthwindConnectio ...

  6. MFC中窗口实现拖拽文件功能

    MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示. 图1 文件拖拽功能 实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响 ...

  7. C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

    在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,首先需要实现类似于资源管理器的界面,通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.显示结果 ...

  8. matlab treeview,treeview控件

    高分在线等:C#中如何给treeview控件上的节点前添比如有一treeview1控件,需要在其所有节点前均加一静态小图标(所有节点我也新手,正好刚用过这功能.如下: 1. 到工具箱中拖一个image ...

  9. 给TreeView控件绑定数据

    TreeView控件显示Node对象的等级体系结构,每个Node对象包含了一个标签和可选的点位图.TreeView控件通常用于显示文档头.索引中的条目.磁盘上的文件和目录或者可以显示为等级结构的各种其 ...

最新文章

  1. 【 全干货 】5 分钟带你看懂 Docker !
  2. ImageView 缩放
  3. 二叉搜索树简介和部分题目
  4. 如何搭建和使用 Xcode 开发环境
  5. python赋值浅拷贝和深拷贝的区别_浅拷贝、深拷贝和普通赋值操作有什么区别?...
  6. java String.intern();
  7. vba编写的出库单(可添加出库项目记录、生成、打印出库单)
  8. arcgis api for js绘制箭头图
  9. 百变鹏仔缤纷彩色文字广告位代码美化版
  10. MySQL InnoDB 锁
  11. mmsegmentation 训练自制数据集全过程
  12. 广州移动华为认证培训之行
  13. 【PP系列】SAP PP模块工作中心主数据维护
  14. 基于51单片机的EEPROM读写
  15. MySQL 技术内幕——存储引擎
  16. PHP7如何从摆地摊 到实现大神梦想
  17. uni-app接入高德地图SDK实现定位用户城市
  18. 4万高考冒名顶替事件_山东高考冒名顶替事件后续, 人民日报第一时间亮明态度!...
  19. crc32算法简单理解
  20. [转]创业Web2.0之客齐集王建硕:互联网,我醉我做

热门文章

  1. 第十六届无线节能信标灯规格说明
  2. 械模拟计算器 - 计算尺
  3. 我们也铺好了新赛道啦!!!
  4. 任艳频 | 竞赛12年纪念文集--后记
  5. c++语言关键字大全,C++语言const 关键字使用方法图文详解
  6. 什么叫大地高_等电位箱有什么用?
  7. linux文件属性解析,Linux操作系统的文件属性与目录配置解析
  8. axi dma cyclic mode调试完成
  9. SCAPY pcap文件数据分析 python3
  10. rpm 使用手册 (谷歌翻译)