2016-06-01 110 views
0

我試圖實際上取消選擇我的TreeView中的所有節點。通過「實際」,我的意思是TreeView1.SelectedNode = null;實際上會取消選擇樹中的節點。實際上取消選擇TreeView中的所有節點(.NET)

從目視上看,節點被取消選擇。但是,當我嘗試添加新節點時,樹視圖會自動選擇樹中的第一個節點(位於頂部),並在理想情況下創建父節點時創建子節點。我不能在添加之前取消選擇所選節點,因爲用戶可能想要添加一個子節點。我想要添加的父/子節點的行爲將基於在樹視圖中選擇的內容。如果未選擇任何內容,請添加父項,如果選擇了某項內容,請在該選定節點中添加一個子項。

我構造一個名爲node一個TreeNode對象與圖像和文本的功能和所有的話,我有以下幾點:

 if (tvContent.SelectedNode == null) 
      tvContent.Nodes.Add(node); 
     else 
     { 
      tvContent.SelectedNode.Nodes.Add(node); 
      tvContent.SelectedNode.Expand(); 
     } 

我有一個「全部取消」,即應該使上面的代碼鍵工作。該按鈕的代碼很簡單:

tvContent.SelectedNode = null; 

請原諒我的C#和VB.NET標記。我對兩個人都很好,所以如果有人能用任何一種語言來幫助我,那就太棒了!

感謝

編輯: 有趣。看起來,在測試選定節點是否爲空時,.NET會自動將所選節點設置爲樹中的第一個節點。以下代碼顯示「觸發器」消息框,但在if語句完成後立即選擇樹中的第一個節點。

private void btnDeselectAll_Click(object sender, EventArgs e) 
    { 
     tvContent.SelectedNode = null; 
     if (tvContent.SelectedNode == null) MessageBox.Show("trigger"); 
    } 

編輯2:問題在於使用InputBox作爲節點的標題輸入。無論出於何種原因,這會更改樹視圖的選定節點。我在股票項目中嘗試了這一點,並設法複製這個問題。我想這沒有修復:S

+0

放在tvContent.SelectedNode塊,F11(分步調試)斷點權之後,看看你的代碼的行改變了tvContent.SelectedNode到第一節點。 – Martheen

+0

沒有找到任何改變它的代碼,它真的看起來像它自己改變。 – KingDan

+0

@Martheen請查看我的帖子編輯。看起來這是奇怪的行爲.net – KingDan

回答

0

所以事實證明,取消「真正的」取消選擇是不可能的。只要樹視圖失去焦點,再次獲得焦點(例如通過彈出的輸入框窗口),所選節點將不再爲空。

我周圍的工作是要引入使節點標題輸入在主窗體上,而不是在另一種形式做了一些輸入選項變爲可見的面板。我不喜歡這個修補程序,但這是所有可以完成的。

0

我試圖重現您的方案,但失敗了。在將SelectedNode設置爲null之後,在嘗試讀取它時它仍爲空。我想檢查幾件事:

  1. 你確定你實際上取消了選擇節點嗎?如果將TreeView的「HideSelection」屬性設置爲True(默認),則該選擇在TreeView失去焦點時消失(例如,當您單擊取消選擇所有按鈕時 - 使其看起來像正在工作)。通過將HideSelection設置爲False,確保不是這種情況。

  2. 你確定你不是觸發事件處理程序(如SelectedNodeChanged)當您設置SelectedNode爲空?

+1

這是作爲答案發布的,但它不會試圖回答這個問題。它應該可能是編輯,評論,另一個問題,或者完全刪除。 – Codexer

+0

嘿,謝謝你的迴應! 1. HideSelection設置爲true,但在更改時發生同樣的問題。 2.在我選擇的節點被設置爲null後,沒有事件被觸發,甚至沒有「AfterSelect」。 我做了一個深入的調試,它看起來像樹視圖將拒絕添加一個新節點時沒有選定的節點。我目前的解決方案的想法是在添加新節點之前設置某種標誌,這將確定是否首先選擇了另一個節點。 – KingDan

+0

我的文章「EDIT2」提供了一種複製問題的方法。我不知道如何解決這樣的問題:S – KingDan

0

這爲我工作

Private LastSelectetNode As TreeNode 

Protected Overrides Sub OnBeforeSelect(e As TreeViewCancelEventArgs) 
    e.Cancel = LastSelectetNode Is Nothing 
    MyBase.OnBeforeSelect(e) 
End Sub 

Protected Overrides Sub OnMouseUp(e As MouseEventArgs) 
    Dim nd = MyBase.HitTest(e.Location).Node 
    If LastSelectetNode Is nd Then 
     SelectedNode = Nothing 
     LastSelectetNode = Nothing 
    Else 
     LastSelectetNode = nd 
    End If 
    MyBase.OnMouseUp(e) 
End Sub 
相關問題