【问题标题】:How can I add child nodes to a treeview with deciding the depth level?如何通过确定深度级别将子节点添加到树视图?
【发布时间】:2019-07-24 09:07:03
【问题描述】:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Treeview_Test
{
    public partial class Form1 : Form
    { 
        int numberofroots = 1000;
        int childsnum = 50;
        int leveldepth = 0;

        public Form1()
        {
            InitializeComponent();

            AddNodes();
        }

        private void AddNodes()
        {
            advancedTreeView1.Nodes.Clear();

            for (int i = 0; i < numberofroots; i++)
            {
                advancedTreeView1.Nodes.Add("New Node " + i.ToString());

                TreeNode subnode = advancedTreeView1.Nodes[i];

                if(allRootsWithChilds.Checked)
                {
                    subnode.Nodes.Add("New Node " + i.ToString());
                }
                else
                {
                    if (i < childsnum)
                    {
                        subnode.Nodes.Add("New Node " + i.ToString());
                    }
                }
            }
        }

        private void allRootsWithChilds_CheckedChanged(object sender, EventArgs e)
        {
                AddNodes();
        }
    }
}

现在,如果选中该复选框,它将向所有根节点添加一个子节点。所有 1000 个根节点都将有一个子节点。如果未选中,则仅 1000 个根节点中的前 50 个将有一个子节点。

我现在要做的是,如果复选框被选中,或者是否有一个子节点的根节点,我想决定深度级别。例如,如果深度级别为 1,则前 50 个根节点或所有根节点将有一个子节点。

但是如果深度级别例如为 4,那么每个根节点如果是 50 或全部将有 4 个子节点:

Node0
  Node1
    Node2
      Node3
        Node4
Node1
  Node1
    Node2
      Node3
        Node4
....
Node49
  Node1
    Node2
      Node3
        Node4

变量 childsnum 决定有多少根节点将有子节点。 变量 leveldepth 应该决定将子节点添加到每个根节点的深度。 然后我想添加另一个 int 变量来决定每个级别有多少个孩子。

例如,在级别 3 中,每个根节点将有 50 个节点。 而在级别 1,每个根节点只有 1 个节点。

【问题讨论】:

  • 当你有两个独立的if 语句,它们都具有相同的主体,你可以合并子句:if(allRootsWithChilds.Checked || i &lt; childsnum) subnode.Nodes.Add("New Node " + i.ToString()); 然后你只需要更新一个if 语句的块。跨度>

标签: c# winforms


【解决方案1】:

我认为您缺少的只是继续将子节点添加到下一个节点的逻辑。您所要做的就是根据leveldepth 的值创建另一个循环,并在循环中继续设置subNode 等于subNode.Nodes[0]

注意,我们也可以使用Nodes.Add(也就是我们刚刚添加的节点)的返回值来设置我们的subnode变量:

private void AddNodes()
{
    advancedTreeView1.Nodes.Clear();

    for (int i = 0; i < numberOfRoots; i++)
    {
        TreeNode subnode = advancedTreeView1.Nodes.Add("New Node " + i);

        if (allRootsWithChilds.Checked || i < childCount)
        {
            for (int j = 0; j < depthLevel; j++)
            {
                // Add a new child node and set subnode to the new node we just added
                subnode = subnode.Nodes.Add(subnode.Text);
            }
        }
    }
}

【讨论】:

  • 这很好用。但我认为在逻辑上,例如,当深度级别为 4 时,如果我们取根 node0,则子节点的编号应如下所示: Node0 > Node0 > Node0 > Node0 > Node0 因为在每个级别中只有一个节点,所以在这个级别每次都是第一个节点。例如在 1 级它应该是 Node0 也应该在 2 级 Node0 现在每个级别的子节点都有增加的数量:Node0 > Node1 > Node2 > Node3 > Node4 我该如何更改它?
  • 如果您希望子节点编号与父节点匹配(这就是您要问的吗?),则在分配节点文本时只需使用i 而不是j。此外,这不是您在上面的示例输出中所拥有的...也许如果您更新您的问题以包含所需的输出格式,这会有所帮助。
  • 我更新了答案,通过专门使用subnode.Text 设置子值来提供您所询问的输出。还稍微简化了代码,使用Add方法的返回值来设置我们的subnode变量。
  • 现在,例如,级别深度为 5,那么例如在根节点 5 上,它将类似于 Node5 > Node5 > Node5 > Node5 > Node5 > Node5,如果是例如 Node4,那么它将是 Node4 > Node4 > Node4 > Node4 > Node4 > Node4 而不是所有子节点中的 0。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2012-04-15
  • 2010-11-26
  • 2013-03-25
  • 1970-01-01
  • 2014-04-16
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多