我有一个包含多个节点的 TreeView,如果删除了特殊节点(您将在代码中看到),则更新 TreeView 后应展开父节点。
这是我尝试的方法:
public void Remove(){
...
...
else if ((NodeType)n.Tag == NodeType.Attribute) //Here I simply check if it's the "special" parent
{
Commands.CommandAttributeRemove cmd = (Commands.CommandAttributeRemove)mAppData.CommandFactory.Create("AttributeRemove");
cmd.Data = n.Text;
cmd.ObjectClass = mObjectClass;
cmd.ObjectTypeName = n.Parent.Parent.Text;
list.Add(cmd);
mNodeToExpand = mTreeView.SelectedNode.Parent; //THIS LINE IS IMPORTANT... mNodeToExpand is a member variable that I use in UpdateData()
}
...
...
UpdateData();
}
public void UpdateData()
{
… //A lot of not-so-important stuff happening here (at least not important for what I want, I think)
...
//Update Selected Items (for the case that objects were deleted) and UpdateSelection
OnSelect();
//UpdateSelection();
this.Update();
现在这是有趣的事情:
if (mNodeToExpand != null)
{
mNodeToExpand.Expand();
mNodeToExpand = null;
}
}
这就是我试图实现我想要的目标的方法,但是该节点没有扩展(它仍然有其他子节点)。
在
Remove()
中我也尝试了mTreeView.SelectedNode.Parent.Nodes.Add(new Node("Blabla"));
但它甚至没有添加节点。
在
if(mNodeToExpand!=null)
中,我还尝试将 selectedNode 设置为 mNodeToExpand,但它给了我一个 NullReferenceException,即使我在 IF 中检查它是否为空。为什么?
这不可能是这样。 FullPath 显然是树视图中节点的路径,因此,例如,如果您有 Node2,它是 Node1 的子节点,那么 Node1 的 FullPath 是“Node1”,Node2 的 FullPath 是“Node1//Node2”……现在是这样是因为某种奇怪的原因,我的 mNodeToExpand 丢失了 FullPath 的信息,突然间它只是“Node2”而不是“Node1//Node2”...因此它没有展开,导致 TreeView 找不到具有此信息的节点FullPath… 现在我所做的是将 FullPath 存储在一个字符串中,当我想要扩展它时,我会搜索具有此 FullPath 的节点,然后扩展返回的内容。这太愚蠢了,因为想象一个包含 1 000 000 个节点的列表。这可能需要很长时间。我开始真的不喜欢这个 Crownwoods.DotNetMagic 库,但它已经是我正在处理的现有代码。