当我添加它时,C#树正在复制每个节点

Toa*_*ums 2 c# treeview tree duplicates

所以基本上我正在做的是向后建造一棵树.我开始在树叶,然后添加他们的父母,然后他们的(他们最后是一个3级树).

我没有问题添加叶子(我查询数据库,并为每个条目创建一个TNode(TreeNode类的扩展),然后将它们添加到树).这一步没有重复 - 当我去添加叶子的父母时,就会发生重复.

我循环遍历树叶,并且当两个叶子具有不同的截面编号时(几乎是我想要分组的数字),它几乎会创建一个新的父节点.

程序正在做的是在每个父节点下创建每个叶节点的两个SET,所以它看起来像这样:

它不会让我发布图像,所以我会尝试在文本中绘制树:这样的事情

    Part 1
       child 1-1
       child 1-2
       child 1-3
       child 1-1
       child 1-2
       child 1-3
    Part 2
       child 2-1
       child 2-2       
       child 2-1
       child 2-2  

这是执行它的代码......它真的很奇怪,因为当我调试它时,每个节点的子节点数每次按预期增长一个,但是一旦添加了所有父节点,就有两个每片叶子......

我也尝试将数量减少到只有1,它增加了一个父母,它有一个孩子,这是重复....

无论如何,代码:

请注意,switch语句并不重要,它们只是设置新节点的文本

private void addLvl1Nodes() {

    int i = 0;
    TNode newNode = null;
    int count = tv_master.Nodes.Count;
    while (i < count) {
        TNode tn = (TNode)tv_master.Nodes[i];//get current node
            //if i = 0, then newNode has not been set, so make a new one!
            if ((i == 0)||
                (tn.Section != ((TNode)tv_master.Nodes[i-1]).Section )||
                (tn.Text.Substring(0, 1) != tv_master.Nodes[i - 1].Text.Substring(0, 1))){

                newNode = new TNode("");
                tv_master.Nodes.Add(newNode);
                switch (tn.Text.Substring(0, 1)) {
                    case "1": newNode.Text = "Part One"; break;
                    case "2": newNode.Text = "Part Two"; break;
                    case "3": newNode.Text = "Part Three"; break;
                }

                newNode.Section = tn.Section;

            }
        newNode.Nodes.Add(tn);

        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望有人之前有类似的错误 - 因为我找不到解决方案.

非常感谢!

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++

对于遇到类似问题的任何人,这里是我的代码的最终副本,现在按预期工作:)

private void addLvl1Nodes() {

            TNode newNode = null;

            List<TNode> nodes = tv_master.Nodes.Cast<TNode>().ToList();
            tv_master.Nodes.Clear();

            for(int i = 0; i<nodes.Count; i++){
                TNode tn = nodes[i];

                if ((i == 0) ||
                    (tn.Section != nodes[i-1].Section) ||
                    (tn.Text[0] != nodes[i-1].Text[0])) {

                    newNode = new TNode("");
                    tv_master.Nodes.Add(newNode);
                    switch (tn.Text[0]) {
                        case '1': newNode.Text = "Part One"; break;
                        case '2': newNode.Text = "Part Two"; break;
                        case '3': newNode.Text = "Part Three"; break;
                    }

                    newNode.Section = tn.Section;

                }

                newNode.Nodes.Add(tn);

            }
        }
Run Code Online (Sandbox Code Playgroud)

小智 5

在进行此调用之前,您可能需要从其旧父级中删除tn:

  newNode.Nodes.Add(tn);
Run Code Online (Sandbox Code Playgroud)

否则,您实际上不会有两个单独的tn实例(子节点),但它会在层次结构中出现多次.(直接在tv_master下,一次在新创建的节点下.)

仅保留两个单独的节点列表(或树)可能会有所帮助.一个用于保存新创建的父节点,另一个用于叶节点.然后你可以在最后加入所有东西.也许像这样开始你的循环:

List<TNode> listLeafNodes = new List<TNode>(tv_master.Nodes);
tv_master.Nodes.Clear();
for( int i=0; i<listLeafNodes.Count; ++i )
{
...
}
Run Code Online (Sandbox Code Playgroud)

当然,我不确定你用于TNode和tv_master的课程.我在MSDN上看到的TNode接口似乎没有任何.Nodes属性.此外,似乎至少有3个不同的TreeView类.TNode的完全限定类名和tv_master的定义可能有助于我们更好地理解事物.