C# TreeView树节点上下移动

 
 /// <summary>
        /// 上移
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsbMoveUp_Click(object sender, EventArgs e)
        {
            if (Tv_tree.SelectedNode == null)
            {
                MessageBox.Show("请选择需要移动的的节点!");
                this.Focus();
                return;
            }
            folder  model = new folder();
            TreeNode node = Tv_tree.SelectedNode;     //获得选中节点的值
            model.folderId = node.Tag.ToString();
            model.TheOrder = node.Name.ToString();
            if (node.PrevNode == null)      //选中节点的上一个节点为Null则返回
            {
                return;
            }
            folder upModel = new folder();
            TreeNode upNode = node.PrevNode;            //获得选中节点的上一个节点
            upModel.folderId = upNode.Tag.ToString();
            upModel.TheOrder = upNode.Name;
            bool flag = folderOperation.MoveUp(model, upModel);       //将两个节点的排序编号互换
            if (flag)       //如果执行成功
            {
                string theOrder = node.Name;
                node.Name = upNode.Name;
                upNode.Name = theOrder;
                TreeNode newNode = (TreeNode)node.Clone();      //克隆选中的节点
                if (node.Parent == null)
                {
                    Tv_tree.Nodes.Insert(upNode.Index, newNode);      //在选中节点的上一个节点的地方插入本节点
                }
                else
                {
                    node.Parent.Nodes.Insert(upNode.Index, newNode);
                }
                node.Remove();
                Tv_tree.SelectedNode = newNode;
            }
            else
            {
                return;
            }
        }
        /// <summary>
        /// 下移
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsbMoveDown_Click(object sender, EventArgs e)
        {
            if (Tv_tree.SelectedNode == null)
            {
               MessageBox.Show("请选择需要移动的的节点!");
                this.Focus();
                return;
            }
            folder model = new folder();
            TreeNode node = Tv_tree.SelectedNode;     //选中的节点
            model.folderId = node.Tag.ToString();
            model.TheOrder = node.Name.ToString();
            if (node.NextNode == null)      //下一个节点为Null时返回
            {
                return;
            }
            folder downModel = new folder();
            TreeNode dowNode = node.NextNode;
            downModel.folderId = dowNode.Tag.ToString();
            downModel.TheOrder = dowNode.Name;
            bool flag = folderOperation.MoveUp(model, downModel);
            if (flag)
            {
                string theOrder = node.Name;
                node.Name = dowNode.Name;
                dowNode.Name = theOrder;
                TreeNode newNode = (TreeNode)dowNode.Clone();       //克隆下一个节点及其所有的子节点
                if (node.Parent == null)
                {
                    Tv_tree.Nodes.Insert(node.Index, newNode);    //在原节点的位置插入下一个节点的值
                }
                else
                {
                    node.Parent.Nodes.Insert(node.Index, newNode);
                }
                dowNode.Remove();           //删除掉选中节点的下一个节点
                Tv_tree.SelectedNode = node;  //重新选中
            }
            else
            {
                return;
            }
        }
 
 string sql = string.Format("update folder set theorder = '{0}' where folderid = '{1}'", model.TheOrder, upModel.folderId);           
 string sql1 = string.Format("update folder set theorder = '{0}' where folderid = '{1}'", upModel.TheOrder, model.folderId);
     /// <summary>
        /// 节点的展开和折叠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvDocInfo_AfterExpand(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Parent == null)
            {
                TreeView tree = (TreeView)sender;
                tree.AfterCheck -= new TreeViewEventHandler(this.tvDocInfo_AfterExpand);
                //折叠其他同级节点   
                TreeNode parentNode = e.Node.Parent;
                if (parentNode != null)
                {
                    foreach (TreeNode tn in parentNode.Nodes)
                    {
                        if (tn != e.Node)
                            tn.Collapse();
                    }
                }
                else
                {
                    foreach (TreeNode tn in tree.Nodes)
                    {
                        if (tn != e.Node)
                            tn.Collapse();
                    }
                }
            }

        }


节点拖拽,必须设置TreeView的AllowDrop属性为True;

        private Point Position = new Point(0, 0);

        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            DoDragDrop(e.Item, DragDropEffects.Move);
        }

        private void treeView1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(TreeNode)))
                e.Effect = DragDropEffects.Move;
            else
                e.Effect = DragDropEffects.None;
        }

        private void treeView1_DragDrop(object sender, DragEventArgs e)
        {
            TreeNode myNode = null;
            if (e.Data.GetDataPresent(typeof(TreeNode)))
            {
                myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
            }
            else
            {
                MessageBox.Show("error");
            }
            Position.X = e.X;
            Position.Y = e.Y;
            Position = tvType.PointToClient(Position);
            TreeNode DropNode = this.tvType.GetNodeAt(Position);
            if (FunctionsUI.CreateQuestionDialog("是否要将"+myNode.Text+"移动"+DropNode.Text+"类别下?") == DialogResult.OK)
            {
                // 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();
                    tvType.Nodes.Add(DragNode);
                }
            }
        }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值