TreeView 控件节点上下移动

#region 下移
private void tsmiDownNode_Click(object sender, EventArgs e)
{
     TreeNode trNode = treeRegion.SelectedNode;       

     TreeNode nextNode = trNode.NextNode;
     if (nextNode == null)   //下一个节点为Null时返回
     {
        return;
     }

     TreeNode NewNode = (TreeNode)trNode.Clone();
     trNode.Parent.Nodes.Insert(nextNode.Index + 1, NewNode);
     trNode.Remove();

     treeRegion.SelectedNode = NewNode;

}
#endregion

#region 上移
private void tsmiUpNode_Click(object sender, EventArgs e)
{
  TreeNode trNode = treeRegion.SelectedNode;
  TreeNode preNode = trNode.PrevNode;
  if (preNode == null)  //选中节点的上一个节点为Null则返回
  {
     return;
  }
  TreeNode NewNode = (TreeNode)trNode.Clone();
  trNode.Parent.Nodes.Insert(preNode.Index, NewNode);
  trNode.Remove();
  treeRegion.SelectedNode = NewNode; 
}
#endregion

  不保存数据只是移动;如果需要保存到数据库需要自己添加保存数据的代码

//拖动节点上下移动

 #region 拖动上下移动节点
        //拖动
        private void treeRegion_ItemDrag(object sender, ItemDragEventArgs e)//左键拖动
        {
            if (e.Button == MouseButtons.Left)
            {
               TreeNode node = treeRegion.SelectedNode;
                if (node != null)
                {
                    DoDragDrop(node, DragDropEffects.All);
                }
            }
        }
        private void treeRegion_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(TreeNode)) == true)
            {
                e.Effect = DragDropEffects.All;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
        private void treeRegion_DragDrop(object sender, DragEventArgs e)
        {
            //获得拖放中的节点
            TreeNode moveNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
            //根据鼠标坐标确定要移动到的目标节点
            Point pt;
            TreeNode targeNode;
            pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode = this.treeRegion.GetNodeAt(pt);

            //如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
            TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
            if (targeNode.Nodes.Count == 0)
            {
                targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
            }
            else
            {
                targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
            }
            //更新当前拖动的节点选择
            treeRegion.SelectedNode = NewMoveNode;
            //展开目标节点,便于显示拖放效果
            targeNode.Expand();

            //移除拖放的节点
            moveNode.Remove();
        }
        #endregion

Demo:

    public Form1()
        {
            InitializeComponent();

            CreateTreeView();//构建树
        }

        private void CreateTreeView()
        {
            treeView1.Nodes.Add("北京");
                treeView1.Nodes[0].Nodes.Add("昌平区");
                treeView1.Nodes[0].Nodes.Add("通州区");
                treeView1.Nodes[0].Nodes.Add("海淀区");
            treeView1.Nodes.Add("河北省");
                treeView1.Nodes[1].Nodes.Add("石家庄市");
                treeView1.Nodes[1].Nodes.Add("唐山市");
                treeView1.Nodes[1].Nodes.Add("廊坊市");
                treeView1.Nodes[1].Nodes.Add("保定市");
            treeView1.ExpandAll();
        }
        #region 拖动节点上下移动
               
        private void treeRegion_ItemDrag(object sender, ItemDragEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            { 
            DoDragDrop(e.Item, DragDropEffects.Move);
            }
        }
        private void treeRegion_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(TreeNode)))
                e.Effect = DragDropEffects.Move;
            else
                e.Effect = DragDropEffects.None;
        }

        private Point pt = new Point(0, 0);
        private void treeRegion_DragDrop(object sender, DragEventArgs e)
        {
            #region 添加到目标节点下
            /*
            TreeNode myNode = null;
            if (e.Data.GetDataPresent(typeof(TreeNode)))
            {
                myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
            }
            else
            {
                MessageBox.Show("error");
            }
            pt.X = e.X;
            pt.Y = e.Y;
            pt = treeView1.PointToClient(pt);
            TreeNode DropNode = this.treeView1.GetNodeAt(pt);

            //1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
            if (DropNode != null && DropNode.Parent != myNode && DropNode != myNode)
            {
                TreeNode DragNode = myNode;
                // 将被拖拽节点从原来位置删除。
                myNode.Remove();
                // 在目标节点下增加被拖拽节点
                DropNode.Nodes.Add(DragNode);
            }
            //如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
            if (DropNode == null)
            {
                TreeNode DragNode = myNode;
                myNode.Remove();
                treeView1.Nodes.Add(DragNode);
            }
             */
            #endregion

            #region 和目标节点替换

            //获得拖放中的节点
            TreeNode moveNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
            //根据鼠标坐标确定要移动到的目标节点
            TreeNode targeNode;
            Point pt;
            pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode = this.treeView1.GetNodeAt(pt);

            //如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
            TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
            if (targeNode.Nodes.Count == 0)
            {
                targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
            }
            else
            {
                targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
            }
            //更新当前拖动的节点选择
            treeView1.SelectedNode = NewMoveNode;
            //展开目标节点,便于显示拖放效果
            targeNode.Expand();
            //移除拖放的节点
            moveNode.Remove();
            #endregion
            
        }
        #endregion

猜你喜欢

转载自blog.csdn.net/cn_514/article/details/90598381