ASP.Net中的TreeView控件中对节点的上移和下移操作

Web中的TreeView中的没有PreNode和NextNode属性。

但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点。

TreeView中要么只有一个根节点;要么没有根节点,都是并列排的,这个要判断。

这里主要是用了递归,把有子节点的节点一起移动。

还有一点是,对父节点ID的保存,这里是保存在TreeNode 的Targe属性中

1.首先要定义节点集合交换变量

    TreeNode preNode, nextNode, currentNode;
    List<TreeNode> currNodelist = new List<TreeNode>();
    List<TreeNode> Nodelist = new List<TreeNode>();


2.上移按钮的方法

     //当前选中节点
        currentNode = TreeView1.SelectedNode;
        if (currentNode == null)
        {
            return;
        }
        else
        {
            //判断是否有父节点,根据父节点取数据
            if (currentNode.Parent != null)
            {
                //前一个节点索引
                int pre = currentNode.Parent.ChildNodes.IndexOf(TreeView1.SelectedNode) - 1;
                if (pre == -1)
                { return; }
                else
                {
                    //第一个节点
                    TreeNode fisrtnode = currentNode.Parent.ChildNodes[0];
                    //前一个节点
                    preNode = currentNode.Parent.ChildNodes[pre];
                    //判断第一个节点是否自己
                    if (currentNode == preNode)
                    { return; }
                    else
                    {
                        //交换数据,并选中
                        Exchange(currentNode, preNode);
                    }
                }
            }
            else//没有父节点,直接从根节点读
            {
                //前一个节点索引
                int pre = this.TreeView1.Nodes.IndexOf(TreeView1.SelectedNode) - 1;
                if (pre == -1)
                { return; }
                else
                {
                    //第一个节点
                    TreeNode fisrtnode = this.TreeView1.Nodes[0];
                    //前一个节点
                    preNode = this.TreeView1.Nodes[pre];
                    //判断第一个节点是否自己
                    if (currentNode == preNode)
                    { return; }
                    else
                    {
                        //交换数据,并选中
                        Exchange(currentNode, preNode);
                    }
                }
            }
        }

3.下移按钮中的方法

      currentNode = TreeView1.SelectedNode;
        if (currentNode == null)
        {
            return;
        }
        else
        {
            if (currentNode.Parent != null)
            {
                //下一个节点索引
                int next = currentNode.Parent.ChildNodes.IndexOf(TreeView1.SelectedNode) + 1;
                //最后一个节点
                TreeNode lastnode = currentNode.Parent.ChildNodes[currentNode.Parent.ChildNodes.Count - 1];
                if (lastnode == currentNode)
                { return; }
                else
                {
                    //下一个节点
                    nextNode = currentNode.Parent.ChildNodes[next];
                    //交换数据
                    Exchange(currentNode, nextNode);
                }
            }
            else
            {
                //下一个节点索引
                int next = this.TreeView1.Nodes.IndexOf(TreeView1.SelectedNode) + 1;
                //最后一个节点
                TreeNode lastnode = this.TreeView1.Nodes[this.TreeView1.Nodes.Count - 1];
                //判断最一个节点是否自己
                if (lastnode == currentNode)
                { return; }
                else
                {
                    //下一个节点
                    nextNode = this.TreeView1.Nodes[next];
                    Exchange(currentNode, nextNode);
                }

            }
        }


4.节点中子节点递归加载到集合中,因为要两两交换,所以定义了两个递归方法

    /// <summary>
    /// 获取上一个节点的所有子节点,加载到当前节点集合中
    /// </summary>
    /// <param name="node"></param>
    private void FetchNode(TreeNode node)
    {
        for (int i = 0; i < node.ChildNodes.Count; i++)
        {
            currNodelist.Add(node.ChildNodes[i]);
        }

        for (int j = 0; j < node.ChildNodes.Count; j++)
        {
            FetchNode(node.ChildNodes[j]);
        }
    }
    /// <summary>
    /// 获取下一个节点的所有子节点
    /// </summary>
    /// <param name="node"></param>
    private void FetchNextNode(TreeNode node)
    {
        for (int i = 0; i < node.ChildNodes.Count; i++)
        {
            Nodelist.Add(node.ChildNodes[i]);
        }

        for (int j = 0; j < node.ChildNodes.Count; j++)
        {
            FetchNextNode(node.ChildNodes[j]);
        }
    }



5.如果该节点有子节点就要交换子节点,递归加入,我是用Target保存了父节点的ID

    private void AddNode(TreeNode node, List<TreeNode> list)
    {
        List<TreeNode> tnlist = list.Where(n => n.Target== node.Value).ToList();
        foreach (TreeNode item in tnlist)
        {
            node.ChildNodes.Add(item);
            AddNode(item, list);
        }
    }


6.这是个数据交换的方法

    /// <summary>
    /// 两节点之间的数据交换
    /// </summary>
    /// <param name="current">当前节点</param>
    /// <param name="node">上一个节点或下一个节点</param>
    private void Exchange(TreeNode current, TreeNode node)
    {
        //判断是否有子节点
        if (current.ChildNodes.Count > 0)
        {
            //获取当前所有节点填充到currNodelist
            FetchNode(current);
        }
        if (node.ChildNodes.Count > 0)
        {
            //填充节点到Nodelist(上一节点或下一节点的子节点集合)
            FetchNextNode(node);
        }
        //交换数据
        string g_text = node.Text;//文本
        string g_tag = node.Target;//排序字段
        string g_id = node.Value;//唯一ID
        string toop = node.ToolTip;//父ID
        bool isadd = node.PopulateOnDemand;//是否动态填充节点

        node.Target = current.Target;
        node.Text = current.Text;
        node.Value = current.Value;
        node.ToolTip = toop;
        node.PopulateOnDemand = current.PopulateOnDemand;

        current.Target = g_tag;
        current.Text = g_text;
        current.Value = g_id;
        current.ToolTip = toop;
        current.PopulateOnDemand = isadd;
        //选中
        node.Selected = true;
        //先清空后递归添加节点
        current.ChildNodes.Clear();
        AddNode(current, Nodelist);
        node.ChildNodes.Clear();
        AddNode(node, currNodelist);
    }


 

 第一次写博客,嘿嘿!大笑

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值