【问题标题】:How can I add a node to a node in the TreeView with multiple parents?如何将节点添加到具有多个父级的 TreeView 中的节点?
【发布时间】:2018-01-07 00:56:26
【问题描述】:

我正在使用 C#.NET Framework 3.5,使用 Windows 窗体

我有一个 TreeView 和一个 Excel 文件。在这个 Excel 文件中,有一个“种类”树。我想在 TreeView 中表示这棵树:

Key:    Letter:   Follow:

0  1     A         1  1

1  1     B         2  8
1  1     C         2  9
1  1     D         2  12
1  1     E         2  13

 A
 +-- B
 +-- C
 +-- D
 +-- E

我可以用 TreeViewer 显示它。但是有一点,它不再起作用了:

Key:    Letter:   Follow:

0  1     A        1  1

1  1     B        2  8
1  1     C        2  9
1  1     D        2  12
1  1     E        2  13

2  8     W        3  10
2  8     X        3  10
2  9     Y        3  10
2  12    Z        3  10

3  10    WOOPS    4  1

 A
 +-- B
 |   +-- W
 |   +-- X
 |
 +-- C
 |   +-- Y
 |
 +-- D
 |   +-- Z
 |
 +-- E

在这种情况下,WOOPS 有多个父母。如何在这棵树中添加 WOOPS?

目前我的解决方案是这样的:

 TreeNode[] parents = treeView.Nodes.Find(l.Key, true);
 for (int i = 0; i < parents.Length; i++)
 {
     parents[i].Nodes.Add(l.Follow, l.Letter);
     treeView.Nodes.Find(l.Follow, true)[i].Tag = l;
 }

代码说明:

  1. l(用于字母)是具有Key、Letter 和 Follow 的对象。
  2. 字母 A 已在其中。如果我现在添加 B,上面的代码会搜索具有 B 键 的节点。
  3. 我找到了 A,并添加了我的 B,他的 Follow 作为 Nodekey,Letter 作为名称到A小时候。
  4. 使用 .Tag,我可以将对象本身保存在其中。
  5. 这适用于 CDE,但也适用于 W X Y Z
  6. 现在我想添加 WOOPS
  7. WOOPS 找到的不是一个父母,而是 4
  8. 所以我将他添加到所有四个父母中。

现在问题来了:

  1. WOOPSA 一样有四个孩子。
  2. 这四个孩子发现了四个WOOPS
  3. 现在我将这四个孩子添加到四个 WOOPS
  4. 我添加了 4*4=16 个孩子。

继续下去,parent.Length 变得越来越大(它使我的程序崩溃)。


我该如何解决这个(多父母)问题?

我想出的一个可能的解决方案是,我不是先添加父母再添加孩子,而是采取相反的方式。首先是孩子,然后是父母。我只是复制孩子并将其添加到其他地方(这也复制了他的所有孩子)。不会有“搜索和添加”的时间问题。

对我来说最好的解决方案是,如果我只添加一次 WOOPS,并且 TreeView 只链接到这些对象。因此,如果我打开 W,它会显示 WOOPS。如果我打开 X,它也会显示 WOOPS 是他的孩子。但它是同一个对象。这甚至可能吗?


编辑:

字母是一个字符串(不是字符)。 Key 也是一个字符串。 Follow 也是一个字符串。

那些“数字”是他们的关键和后续行动。如果键有后续(在这种情况下 BCDEA 中有后续),那么它们在 A 下。我希望这会有所帮助。

【问题讨论】:

  • 我很欣赏你试图解释你的问题,但你在做什么还不够清楚。为什么突然加一个字符串?因为这只是字符?为什么这个字符串有多个父母?我没有看到连接。这些数字对我来说没有多大意义。 :-\
  • 也许添加这棵树的要求/规则。我知道你没有在任何地方说它只是字符,但没有信息,我最终猜测。
  • 感谢您的回答。这是一个简化版本。我会编辑它。这些字母通常是字符串。这些是字符还是字符串都没有关系。这个“WOOPS”应该象征着我的问题。它有多个父母,因为“父母”都链接到这个孩子。此后的一切,孩子都是一样的。
  • 明白了,我会小心标签,也许在内存中有一个包含这些对象的数组并将数组索引保存在标签中,这样你就没有重复和其他奇怪的东西了问题。
  • 感谢您的提示。我会记住的。

标签: c# treeview windows-forms-designer


【解决方案1】:

我想我理解你想要达到的目标。我建议改变

 TreeNode[] parents = treeView.Nodes.Find(l.Key, true);
 for (int i = 0; i < parents.Length; i++)
 {
     parents[i].Nodes.Add(l.Follow, l.Letter);
     treeView.Nodes.Find(l.Follow, true)[i].Tag = l;
 }

到这里:

 TreeNode[] parents = treeView.Nodes.Find(l.Key, true);

 TreeNode node = new TreeNode(l.Letter);  
 node.Tag = l;

 for (int i = 0; i < parents.Length; i++)
 {
     parents[i].Nodes.Add(node);
 }

所以基本上,您在循环之外创建节点并多次引用该节点。

编辑: 代码根据注释更正

【讨论】:

  • 嗨,TreeNode node = new TreeNode(l.Follow, l.Letter); 不起作用。但我创建了一个可行的解决方案。问题是,它需要相同的时间。感谢您的帮助!
  • 我已经更正了代码示例,只是为了完成 :)
  • 如果没有自己的 TreeNode 类,您将无法再找到 node。它没有 Nodekey。
【解决方案2】:

我找到了解决方案。 @Zorkind 评论对我帮助很大。基本上它只搜索,在我展开节点之后。所以我不会有缩放问题。此外,我创建了递归树,这也节省了大量时间(有点:有孩子吗?然后将它们添加到树中,再次调用函数,等等)。

它看起来基本上是实时的,但实际上不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多