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

 

目录
相关文章
|
7月前
|
C# 数据库
40.c#:TreeView 控件
40.c#:TreeView 控件
73 1
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
5235 0
Winform控件优化之TabControl控件的使用和常用功能
|
7月前
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
216 2
|
7月前
|
C# Windows
49.c#:StatusStrip 控件
49.c#:StatusStrip 控件
174 1
49.c#:StatusStrip 控件
|
7月前
|
C# 开发者 Windows
48.c#:toolstrip控件
48.c#:toolstrip控件
131 1
|
前端开发 C# 容器
【C#/WPF】用Thumb做可拖拽的UI控件
原文:【C#/WPF】用Thumb做可拖拽的UI控件 需求:简单的可拖拽的图片 使用System.Windows.Controls.
2466 0
|
前端开发 容器
控件篇
原文:控件篇   日常使用最多的控件有6类: 1. 布局控件:可以容纳多个控件或嵌套其他布局控件,例如Grid、StackPanel、DockPanel等,有共同的父类Panel 2.
728 0