C# 树视图刷新问题

C# 树视图刷新问题,c#,treeview,refresh,C#,Treeview,Refresh,我有一个用户无法编辑的树状视图。我尝试刷新的方式是清除整个树并重新添加所有节点和子节点。我通过以下几行代码来实现这一点: treeView.BeginUpdate(); //Freeze drawing treeView.Nodes.Clear(); //Empty Tree addAllNodes(); //This adds the nodes for the tree and sets their name/text property treeView.EndUpdate(); //Un

我有一个用户无法编辑的树状视图。我尝试刷新的方式是清除整个树并重新添加所有节点和子节点。我通过以下几行代码来实现这一点:

treeView.BeginUpdate(); //Freeze drawing
treeView.Nodes.Clear(); //Empty Tree
addAllNodes();  //This adds the nodes for the tree and sets their name/text property
treeView.EndUpdate(); //Unfreeze drawing
在调用addAllNodes之前,我已经尝试添加了Update和Refresh方法,但没有起到任何作用。执行上述操作会给我带来一个错误:

System.ArgumentException:无法在多个位置添加或插入项“NodeName”。您必须首先将其从当前位置删除或克隆

我的第一个问题是,我做了什么导致了这个错误,如何正确地刷新我的树


我的第二个问题是,在刷新之后,是否有任何方法可以恢复用户的扩展节点?因此,所有内容都不会以折叠结束

每个节点都有一个名为.path或.FullPath的路径;现在不要打开VS。因此,您可以在清除节点并记录所有展开的节点之前对其进行漫游,然后在刷新后再次对其进行漫游,查看节点的路径是否与存储的路径匹配。。如果有,则展开它。

至于第二个问题,我所做的是在清除树状视图之前,循环遍历节点,如果节点展开,则将该节点添加到列表中。然后,清除并重新添加节点,在我的列表上循环,展开列表中的节点。我用错误的方法处理这个问题。我继续&只清除了需要更新的孩子。从addAllNodes添加的任何静态节点都不需要触摸。仍然需要一种方法来记住所有展开的节点。@John Arlen-是的,一次通过调试行,树被清除。