如何将节点添加到具有多个父节点的树视图中的节点?



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

我有一个树视图和一个Excel文件。在这个Excel文件中,有一个"一种"树。我想在树视图中表示这棵树:

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

我可以用树查看器显示它。但是有一点,不再有效:

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(字母)是带有键、字母和跟随的对象。
  2. 字母A已经在那里了。如果我现在添加B,上面的代码会使用B 键搜索节点。
  3. 我找到了A,并将我的B与他的Follow一起添加为Nodekey,并将字母作为 A的名字添加到 A 中。
  4. .标签,我可以将对象本身保存在那里。
  5. 这适用于CDE,也适用于W X Y Z
  6. 现在我想添加WOOPS。
  7. WOOPS找到的不是父母一方,而是4项。
  8. 所以我把他加到所有四个父母中。

现在问题来了:

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

这种情况继续下去,parent.Length越来越大(它使我的程序崩溃)。


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

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

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


编辑:

字母是一个字符串(不是字符)。密钥也是一个字符串。"以下">也是一个字符串。

这些"数字"是他们的关键和后续行动。如果密钥有后续(在本例中,BCDE在 A 中有后续),则它们在A下。我希望这有所帮助。

我想我明白你想要实现的目标。我建议改变

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);
}

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

编辑: 根据注释更正的代码

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

它看起来基本上是实时的,但事实并非如此。

最新更新