2010-03-23 168 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

相關問題