我正在使用包含一组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
使用新映射重绘?
答案 0 :(得分:1)
我不知道这是否只是一个拼写错误,但在第一行中您引用了SelectNode
,然后您添加了一个名为SelectedNode
的内容。这些可能指的是不同的变量/属性。
否则,您的SelectedNewNode
函数存在问题,或者此代码正在某些长时间运行的同步操作中执行,并且根本没有重新发生。您根本不需要Refresh
方法;当您在Remove()
上调用TreeNode
方法时,显示将会更新,当您Add
将其更新为另一个父级时,它将再次更新。移除Refresh
电话。
如果您确实尝试在长时间运行的操作期间进行更新,则需要调用Invalidate
,然后调用Update
。但是,如果这不在某个循环或阻塞调用某处,那将毫无意义。
还有一种可能性,就是你调用了TreeView.BeginUpdate
方法而忘记调用TreeView.EndUpdate
,这会阻止显示任何更新。
为了测试这一点,我在一个新的Windows窗体上对此进行了测试,其中TreeView
添加了两个根(Node0
和Node1
)并且每个都有一个子({{1}和Node2
)。以下代码成功更新了Node3
:
TreeView
如果以上建议都没有解决您的问题,请从此工作示例开始,查看工作示例与当前代码之间的区别。