2010-03-23 170 views
1

我正在使用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重新绘制新的映射?

回答

1

我不知道这是否只是一个错字,但在第一行中,你指的是SelectNode,然后你后来添加一个名为SelectedNode的东西。这些可能指的是不同的变量/属性。

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

如果您确实试图在长时间运行过程中进行更新,则需要调用Invalidate,然后再调用Update。但是,如果这不是在一个循环或阻止呼叫某个地方,这将是毫无意义的。

还有另外一种可能性,那就是您调用TreeView.BeginUpdate方法并忘记调用TreeView.EndUpdate,这会阻止显示任何更新。

只是为了测试这一点,我测试这个新的Windows窗体上有TreeView增加了两个根(Node0Node1)和一个孩子给每个(Node2Node3)。下面的代码成功更新TreeView的显示:

TreeNode nodeToMove = treeView1.Nodes.Find("Node3", true).First(); 
TreeNode newParent = treeView1.Nodes.Find("Node0", false).First(); 
nodeToMove.Remove(); 
newParent.Nodes.Add(nodeToMove); 

如果没有上述建议解决您的问题,然后从该工作示例开始,并期待在工作实例和当前的代码之间的区别。

+0

这是一个错误的帖子,它应该是SelectNode。在删除子节点并将其添加到新父项之前,我不调用BeginUpdate方法。我已经清除了treeview中的节点集合,然后重新创建它。这似乎工作。 – mike 2010-03-24 13:40:08

相关问题