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
  • 相关阅读:
    css3新单位vw、vh、vmin、vmax的使用介绍
    vue中的css作用域、vue中的scoped坑点
    vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题
    修改elementUI组件样式无效的问题研究
    Javascript里面的时间处理:将时间戳或时间对象转成字符串格式
    详解vue父组件传递props异步数据到子组件的问题
    vue父组件异步传递prop到子组件echarts画图问题踩坑总结
    父组件中调用子组件的方法和属性
    Echarts使用dataset数据集管理数据
    Echarts的legend改变图例图标为自定义图片
  • 原文地址:https://www.cnblogs.com/51net/p/2475526.html
Copyright © 2011-2022 走看看