zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Day6
    Day6
    Day6
    Day6
    Day6
    Day6
    LeetCode "The Skyline Problem"
    HackerRank
    HackerRank
    HackerRank
  • 原文地址:https://www.cnblogs.com/51net/p/2475526.html
Copyright © 2011-2022 走看看