C# - TreeView: 在特定位置插入节点

5
如何在C# WinForms中向TreeView特定节点插入新的子节点?
我已经在尝试使用TreeView进行操作,但是还没有成功。以下是我希望使用C#的TreeView实现的效果:
treeView.getChildByName("bob").AddChild(new Node("bob's dog"));

这是我最近尝试的(我认为这已经达到了C#不应该允许我达到的复杂程度):

tree.Nodes[item.name].Nodes.Add(new TreeNode("thing"));

不用说,它不起作用。

哦,还有一个懒惰的问题:你能在这些节点中实际存储对象吗?还是TreeNode仅支持字符串和类似的内容?(如果是这种情况,我应该扩展TreeNode.. /叹气)

请帮忙,谢谢!


如果你有选择的自由,可以看看 WPF。你可以随心所欲地建立数据模型并将其绑定到 TreeView。 - VVS
哦,伙计,如果我有机会的话,我会毫不犹豫地转向WPF。首先,任何使用XML的东西都是一步向前的。 - Spectraljump
4个回答

8
您可以使用“插入”代替“添加”。
tree.Nodes[item.name].Nodes.Insert(2, (new TreeNode("thing")));

6
实际上,您的代码应该可行-为了添加子节点,您只需要执行以下操作:
myNode.Nodes.Add(new TreeNode("Sub node"));

也许问题出在你引用现有节点的方式上。我猜测tree.Nodes[item.Name]返回了null?
为了让这个索引器找到节点,你需要在添加节点时指定一个键。你是否将节点名称指定为键?例如,以下代码对我有效:
treeView1.Nodes.Add("key", "root");
treeView1.Nodes["key"].Nodes.Add(new TreeNode("Sub node"));

如果我的答案没用,你能否补充更多细节说明发生了什么?你是否遇到了异常或者什么也没发生?
PS:为了将对象存储在节点中,除了使用Tag属性外,你还可以从TreeNode派生自己的类并在其中存储任何内容。如果你正在开发一个库,这将更加有用,因为你将Tag属性留给了用户使用。
Ran

谢谢您,先生!tree.Nodes[item.Name]确实返回了null(尽管我花了一些时间才找出来)。我不知道如何像您展示的那样设置索引键。这就是我的问题;(我还有一个“无关”的问题让我更加困惑),但我无法获取我想要插入的节点。再次感谢。 - Spectraljump

3

首先,是的,您可以在每个节点中存储对象。每个节点都有一个Tag属性,类型为object

添加节点应该很简单。根据MSDN的说法:

// Adds new node as a child node of the currently selected node.
TreeNode newNode = new TreeNode("Text for new node");
treeView1.SelectedNode.Nodes.Add(newNode);

关于您的编辑,我没有要添加的“SelectedNode”。所以那个方法(顺便说一下,我已经阅读了)没有帮助。 - Spectraljump
啊...看起来Ran有一些很好的例子,似乎它们会起作用 - 没必要我再重复他的内容了。 :) - IAbstract

0
否则,如果Davita不是完美的答案,你需要保留节点的引用,这样如果你有bob的引用,你就可以添加bob的狗。
TreeNode bob = new TreeNode("bob"); treeView1.Nodes.Add(bob); bob.Nodes.Add(new TreeNode("Dog"));

确实,我需要某种引用。但是我不能像你写的那样做,因为我不会在插入节点的同一函数中添加节点。无论如何,Ran已经解决了我的问题并启发了我:我没有“键”,也不知道如何设置它。 - Spectraljump

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接