我正在使用 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;
}
代码说明:
l
(字母)是键,字母和关注的对象。现在问题在于:
这种情况继续发展,parent.Length
变得越来越大(它使我的程序崩溃)。
如何解决这个(多父母)问题?
我提出的一个可能的解决方案是,我采取相反的方式,而不是添加父母和孩子。首先是孩子,然后是父母。我只是复制孩子并将其添加到其他地方(这也复制了他的所有孩子)。不存在“搜索和添加”时间问题。
对我来说最好的解决方案是,如果我只添加 WOOPS 一次, TreeView 只链接到这些对象。因此,如果我打开 W ,则会显示 WOOPS 。如果我打开 X ,它也会像他的孩子一样显示 WOOPS 。但它是相同的对象。这甚至可能吗?
编辑:
信件是一个字符串(不是字符)。 键也是一个字符串。 关注也是一个字符串。
这些“数字”是他们的关键和后续行动。如果密钥有后续跟进(在这种情况下 BCDE 的跟随 A ),那么它们位于 A 之下。我希望这会有所帮助。
答案 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评论给了我很多帮助。基本上它只在我展开节点后进行搜索。所以我不会遇到缩放问题。另外,我创建了树递归,这也节省了很多时间(种类:是否有孩子?然后将它们添加到树中,再次调用函数,依此类推)。
它看起来基本上是实时的,但它不是。