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

时间:2018-01-05 11:11:30

标签: c# treeview windows-forms-designer

我正在使用 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(字母)是键,字母和关注的对象。
  2. 字母 A 已经存在。如果我现在添加 B ,则上面的代码会使用键B 搜索节点。
  3. 我找到 A ,并将 B 添加为关注作为Nodekey,作为名称小时候 A
  4. 使用 .Tag ,我可以将对象本身保存在那里。
  5. 适用于 C D E ,但 W X Y Z
  6. 现在我要添加 WOOPS
  7. WOOPS 找不到一个父级,但 4
  8. 所以我把他加到所有四个父母那里。
  9. 现在问题在于:

    1. WOOPS A 一样,有四个孩子。
    2. 这四个孩子发现了四个 WOOPS
    3. 现在我将这四个孩子添加到四个 WOOPS
    4. 我添加了4 * 4 = 16个孩子。
    5. 这种情况继续发展,parent.Length变得越来越大(它使我的程序崩溃)。

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

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

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

      编辑:

      信件是一个字符串(不是字符)。 也是一个字符串。 关注也是一个字符串。

      这些“数字”是他们的关键和后续行动。如果密钥有后续跟进(在这种情况下 BCDE 的跟随 A ),那么它们位于 A 之下。我希望这会有所帮助。

2 个答案:

答案 0 :(得分:0)

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

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

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

编辑: 根据评论纠正的代码

答案 1 :(得分:0)

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

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