Treeview不刷新以显示childnode从一个父节点移动到另一个父节点

时间:2010-03-23 02:05:00

标签: c# .net winforms treeview

我正在使用包含一组TreeView的Windows窗体TreeNode类。 TreeNode可以有子节点。

我有一个带有2个子节点的根节点(Node1和Node2)

Node1有2个子节点(child1和child2)

我有一个允许用户选择任何节点并将其移动到另一个节点的功能:

TreeNode SelectNode = this.TreeView1.SelectedNode;
TreeNode DestNode = SelectedNewNode();  //function to select a new node
SelectedNode.Remove();
DestNode.Nodes.Add(SelectedNode);
this.TreeView1.Refresh();

执行此操作时,将从当前父节点中删除当前所选节点(child2) (Node1)并添加到Node2。

但是,Refresh()控件的TreeView方法未显示child2在Node2下。如果我调试它并查看Nodes中的TreeView集合,我确实看到child2在Node2下。

有谁可以告诉我为什么Refresh()方法不会将新父项重绘为子映射? 有没有办法告诉TreeView使用新映射重绘?

1 个答案:

答案 0 :(得分:1)

我不知道这是否只是一个拼写错误,但在第一行中您引用了SelectNode,然后您添加了一个名为SelectedNode的内容。这些可能指的是不同的变量/属性。

否则,您的SelectedNewNode函数存在问题,或者此代码正在某些长时间运行的同步操作中执行,并且根本没有重新发生。您根本不需要Refresh方法;当您在Remove()上调用TreeNode方法时,显示将会更新,当您Add将其更新为另一个父级时,它将再次更新。移除Refresh电话。

如果您确实尝试在长时间运行的操作期间进行更新,则需要调用Invalidate,然后调用Update。但是,如果这不在某个循环或阻塞调用某处,那将毫无意义。

还有一种可能性,就是你调用了TreeView.BeginUpdate方法而忘记调用TreeView.EndUpdate,这会阻止显示任何更新。

为了测试这一点,我在一个新的Windows窗体上对此进行了测试,其中TreeView添加了两个根(Node0Node1)并且每个都有一个子({{1}和Node2)。以下代码成功更新了Node3

的显示
TreeView

如果以上建议都没有解决您的问题,请从此工作示例开始,查看工作示例与当前代码之间的区别。