2012-02-09 90 views
1

我有兩種方法直接與我的TreeView(tvTreeview - 一部開拓創新的名字,是吧?)處理:C#TreeView SelectedNode爲空?

private void tvTreeView_MouseClick(object sender, MouseEventargs e) 
{ 
    selectedNode = tvtreeView.HitTest(e.Location).Node; 
    /* some logic */ 
} 

private void cbValue_Changed(object sender, EvenArgs e) 
{ 
    /* some logic related to changing the value that the node refers to. 
    * The nodes in the TreeView are each attached to a different bool, 
    * find that bool and check the value in memory matches that of the 
    * dropdown combobox */ 
    /* clear the tree */ 
    tvTreeView.BeginUpdate(); 
    tvTreeView.Nodes.Clear(); 

    //re-populate and re-draw the TreeView, then call the EndUpdate method 

    tvtreeView.EndUpdate(); 
    tvTreeView.SelectedNode = selectedNode; 
    tvTreeView.SelectedNode.Expand(); 
} 

基本上我做的是重新繪製的TreeView當下拉式組合框的值發生變化時。可變selectedNode是在類的頂部限定:

public static TreeNode selectedNode; 

我得到扔在tvTreeView.SelectedNode一個NullReferenceException,展開();只有當選擇的節點不是子節點時(即它是父節點或根節點時)。舉例來說,如果我的TreeView是這樣的:

Root <- no NullReferenceException thrown 
-Parent <- no NullReferenceException thrown 
    -Child <- NullReferenceException thrown 
    -Child <- NullReferenceException thrown 
-Parent <- no NullReferenceException thrown 
    -Child <- NullReferenceException thrown 

將引發NullReferenceException在任何子節點,而不是家長或根節點上。

當我把一個破發點(或當異常被拋出)的Visual Studio告訴我,selectedNode不爲空,但tvTreeView.SelectedNode是;這是奇怪的,尤其是該行的,因爲:

tvTreeView.Selectednode = selectedNode(); 
//tvTreeView.selectedNode is Null 
//selectedNode is not null 

當我重新繪製樹視圖,它包含了相同的數據(它裝回從存儲器)當它第一次拉伸和節點都在加入相同的順序。

我只是在錯誤的方式接近這一點?爲什麼tvtreeView.SelectedNode僅在選擇子節點而不是父節點/根節點時爲空?

我知道,當你清除TreeView時,沒有任何節點存在了,所以我猜測我的問題與此有關,但爲什麼當用戶單擊子節點時才拋出異常?

+0

您是否刪除/讀取子項而不是重新填充樹視圖的父項? – Botz3000 2012-02-09 10:22:53

+0

@ Botz3000一切都被刪除/重新填充它的時候,一直在根節點重新添加到TreeView。這對於開銷不是太好,但是這樣我就可以確保TreeView中的所有信息都是正確的。 – 2012-02-09 10:24:59

+0

我相信你無法選擇的節點,因爲它不是樹狀的元素了(生成新的節點)。不知道爲什麼它可以與父節點一起工作。 – Botz3000 2012-02-09 10:33:40

回答

2

的tvTreeView.Selectednode因爲你清除樹保持空。 我有類似的問題,即使我試圖選擇樹的一個元素。

不推薦,但解決問題 - 而不是明確的樹,你可以創建一個新的。

trv = new System.Windows.Forms.TreeView(); 
/*build the tree*/ 
trv.SelectedNode = elementOfTheTree; 

第二種選擇是使用beforeSelect事件處理程序並強制選擇操作。 selectedNode在這些事件處理程序中反應良好。 也許是這樣的:

bool isBeforeSelectInProgress = false; 
private void beforeSelectFromTrv(object sender, TreeViewCancelEventArgs e) 
{ 
    if (isBeforeSelectInProgress) 
    { 
     e.Cancel = true; 
     return; 
    } 

    isBeforeSelectInProgress = true; 

    try 
    { 
     //save the changes and return the node that need to be focus 
     TreeNode nodeToSelect = saveChanges((TreeNode)e.Node); 
     //cancel any other selection event 
     e.Cancel = true; 
     nodeToSelect.EnsureVisible(); 
     //release the event handler 
     isBeforeSelectInProgress = false; 
     //and than select the node you wish will be selected 
     (sender as System.Windows.Forms.TreeView).SelectedNode = toSelect; 
    } 
    finally 
    { 
     isBeforeSelectInProgress = false; 
    } 
}