Treeview不会刷新以显示从一个父节点移动到另一个父节点的子节点
我正在使用Windows窗体TreeView
类,其中包含一组TreeNode
s。 TreeNode
可以有子节点。Treeview不会刷新以显示从一个父节点移动到另一个父节点的子节点
我有2个个子节点(节点1和节点2)
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)从其当前父 (节点1)中除去,并加入到节点2。
但是,TreeView
控件的Refresh()
方法未显示child2在Node2下。如果我调试它并查看TreeView
中的Nodes
集合,我确实看到child2在Node2下。
任何人都可以告诉我为什么Refresh()
方法不会重新绘制新的父对子映射? 有没有办法告诉TreeView
重新绘制新的映射?
我不知道这是否只是一个错字,但在第一行中,你指的是SelectNode
,然后你后来添加一个名为SelectedNode
的东西。这些可能指的是不同的变量/属性。
否则,您的SelectedNewNode
函数可能存在问题,或者此代码正在某些长时间运行的同步操作中执行,并且根本不会发生重新绘制。根本不需要Refresh
方法;当您在TreeNode
上调用Remove()
方法时,显示屏将会更新,当您将其Add
更改为另一个父母时,它将再次更新。删除Refresh
电话。
如果您确实试图在长时间运行过程中进行更新,则需要调用Invalidate
,然后再调用Update
。但是,如果这不是在一个循环或阻止呼叫某个地方,这将是毫无意义的。
还有另外一种可能性,那就是您调用TreeView.BeginUpdate
方法并忘记调用TreeView.EndUpdate
,这会阻止显示任何更新。
只是为了测试这一点,我测试这个新的Windows窗体上有TreeView
增加了两个根(Node0
和Node1
)和一个孩子给每个(Node2
和Node3
)。下面的代码成功更新TreeView
的显示:
TreeNode nodeToMove = treeView1.Nodes.Find("Node3", true).First();
TreeNode newParent = treeView1.Nodes.Find("Node0", false).First();
nodeToMove.Remove();
newParent.Nodes.Add(nodeToMove);
如果没有上述建议解决您的问题,然后从该工作示例开始,并期待在工作实例和当前的代码之间的区别。
这是一个错误的帖子,它应该是SelectNode。在删除子节点并将其添加到新父项之前,我不调用BeginUpdate方法。我已经清除了treeview中的节点集合,然后重新创建它。这似乎工作。 – mike 2010-03-24 13:40:08