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的定义可能有助于我们更好地理解事物.