我有兩種方法直接與我的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時,沒有任何節點存在了,所以我猜測我的問題與此有關,但爲什麼當用戶單擊子節點時才拋出異常?
您是否刪除/讀取子項而不是重新填充樹視圖的父項? – Botz3000 2012-02-09 10:22:53
@ Botz3000一切都被刪除/重新填充它的時候,一直在根節點重新添加到TreeView。這對於開銷不是太好,但是這樣我就可以確保TreeView中的所有信息都是正確的。 – 2012-02-09 10:24:59
我相信你無法選擇的節點,因爲它不是樹狀的元素了(生成新的節點)。不知道爲什麼它可以與父節點一起工作。 – Botz3000 2012-02-09 10:33:40