TreeView控件中实现拖拽的功能

 

#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

 

时间: 2024-10-25 17:48:16

TreeView控件中实现拖拽的功能的相关文章

在TreeView控件中实现节点搜索遇到的问题

问题描述 在项目中使用TreeView通过DataBinding的方式展示数据,后来发现数据量稍微有点大的话,在呈现的时候就要耗很多时间,导致用户体验很差,后来通过UIV的方式解决了这个问题(设置VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling")但这时带来一个问题,由于Tree上有搜索节点的功能,在使用了UIVirtual

win32 sdk树形控件的项拖拽实现

本课中,我们将学习如何使用树型视图控件.另外还要学习如何在树型视图中完成拖-拉动作,以及如何使用图象列表. 理论: 树型视图是一种特别的窗口,我们可以使用它一目了然地表示某种层次关系.譬如象在资源管理器中左边窗口中的就是树型视图.您可以调用CreateWindowEx来创建树型视图,传递一个类名""SysTreeView32"",或者您也可以把它放到一个对话框中去.不要忘了在您的代码中加入InitCommonControls函数. 树型视图有几种特有的风格.下面是几

DataGridView控件为何不能拖拽和拉伸(编辑状态下)?

问题描述 按下鼠标:移动鼠标:选中控件时不能拉伸调整,按下鼠标后无法拖拽控件,控件会从屏幕上消失,鼠标弹起后,又恢复到第一张图里的样子请各位高手给解答下啊.VS已经重装过了,用的是别人那边运行没问题的安装包. 解决方案 解决方案二:添加panel控件.picturebox控件后也是一样的效果.而且会使得button.checkbox这些控件也变成和它们一样的效果.解决方案三:大神们,帮忙看看啊~~解决方案四:你设置的属性问题..有不少属性都会导致此结果.你可以尝试重新建一个窗口,然后放datag

C#怎么在treeview控件中显示comboBox中选定的父节点以及其所有的子节点?

问题描述 如题,需要补充一下,treeview并不是在comboBox中的,他们两个是独立的 解决方案 解决方案二:你这无非就是做combobox的选择改变时间,然后给treview控件绑定赋值.

在vs.net2005中,如何获取treeview控件中被选中节点的关键字。

问题描述 DimzsqlstrAsStringzsqlstr="select*frombzliulanwhere环节编号='"&节点关键字的值&"'" 解决方案 解决方案二:在afterselect事件中用e.Node.Text获取解决方案三:谢谢二楼的.成功了!解决方案四:Node的Name属性,作为Key来使用的.可以使用它来搜索定位解决方案五:Treeview.SelectedNode.Text

在 ASP.NET 页面中使用 TreeView 控件

一.            下载源码 http://www.asp.net/IEWebControls/IEWebControls.exe   二.            安装及编译 1.执行安装文件后,在安装目录找到 "build.bat"文件,用记事本将其打开.把"csc.exe"换成绝对路径"C:/WINNT/Microsoft.NET/Framework/v1.1.4322/csc.exe".保存后执行(记得把"只读"

在.NET开发中灵活使用TreeView控件

treeview|控件 ASP.NET真正有用的特性就是其可扩充性.世界各地的开发人员都可以创建自己的自定义控件,这种自定义控件可以方便地在你自己的过程中进行定义.其中,Internet Explorer Web Controls就是由微软公司在标准的ASP.NET控件之外创建的这样一个集合. Windows资源管理器中的驱动器和其下的文件及文件夹就是按照一种层次结构来安排的,在这个控件集中有一个treeview控件为我们提供了一种按层次结构显示信息的方式.treeview控件包含了称做"节点&

ASP.NET中TreeView控件使用小结

asp.net|treeview|控件 中国IT动力,最新最全的IT技术教程最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论 ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql 服务器 Win2000

c#treeview控件问题-c#中treeview控件插入节点

问题描述 c#中treeview控件插入节点 在该控件中,,两节点之间插入一个节点,,大虾,,求救,,......... 解决方案 var tn = new TreeNode("1111"); treeview1.Nodes[n].Nodes.Add(tn); tn.Next = treeview1.Nodes[n].Nodes[原先的第二个节点]; 解决方案二: C# treeview控件部分节点添加checkboxC# TreeView控件中的nodemouseclick事件C#t