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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值