2008-08-05 114 views
61

如何查找樹列表中的哪個節點已激活上下文菜單?例如,右鍵單擊節點並從菜單中選擇一個選項。在上下文菜單下單擊查找節點

我無法使用TreeViews的SelectedNode屬性,因爲該節點只是右鍵單擊並且未被選中。

回答

83

您可以向TreeView添加一個鼠標單擊事件,然後在給出由MouseEventArgs提供的鼠標座標的情況下使用GetNodeAt選擇正確的節點。

void treeView1MouseUp(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     // Select the clicked node 
     treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); 

     if(treeView1.SelectedNode != null) 
     { 
      myContextMenuStrip.Show(treeView1, e.Location); 
     } 
    } 
} 
+4

非常感謝你,我對解決方案有一個小的補充: 你也可以使用「_NodeMouseClick」事件給你一個「TreeNodeMouseClickEventArgs e」,在這種情況下你可以只使用e.Node而沒有麻煩檢查節點是否爲空。 – SDM 2013-07-09 14:44:42

+0

我用MouseDown事件而不是MouseUp得到了期望的結果。 – Javier 2013-07-31 12:53:51

0

如果你想讓上下文菜單依賴於你選擇的物品,那麼最好的辦法就是使用Jonesinator的代碼來選擇點擊物品。您的上下文菜單內容可以依賴於選定的項目。

首先選擇項目,而不是僅僅將其用於上下文菜單具有一些優點。首先是用戶具有關於他點擊哪個的菜單以及菜單與哪個項目相關聯的視覺指示。第二個是這樣,與其他調用上下文菜單的方法(例如鍵盤快捷方式)保持兼容很容易。

11

我發現標準的windows treeview行爲選擇行爲是相當惱人的。例如,如果您正在使用資源管理器並右鍵單擊節點並點擊屬性,則會突出顯示該節點並顯示您單擊的節點的屬性對話框。但是,當您從對話框返回時,突出顯示的節點是您之前選中/突出顯示的節點,然後再進行右鍵單擊。我發現這會導致可用性問題,因爲我一直對我是否在正確的節點上執行操作感到困惑。

因此,在我們的許多GUI中,我們通過右鍵單擊來更改選定的樹節點,以免混淆。這可能不像標準的iwndos應用程序一樣Explorer(我傾向於強烈建模我們的圖形用戶界面行爲後,出於可用性原因的標準窗口應用程序),我相信這一個例外情況導致更多的可用樹。

下面是一些代碼,右鍵單擊過程中改變選擇:

private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
    // only need to change selected note during right-click - otherwise tree does 
    // fine by itself 
    if (e.Button == MouseButtons.Right) 
    {   
     Point pt = new Point(e.X, e.Y); 
     tree.PointToClient(pt); 

     TreeNode Node = tree.GetNodeAt(pt); 
     if (Node != null) 
     { 
      if (Node.Bounds.Contains(pt)) 
      { 
       tree.SelectedNode = Node; 
       ResetContextMenu(); 
       contextMenuTree.Show(tree, pt); 
      } 
     } 
    } 
    } 
+0

這對我來說是最好的解決方案,因爲它實際上選擇了您單擊的節點。 – 2012-01-13 02:07:53

18

這裏是我的解決方案。把這一行到TreeView控件的NodeMouseClick事件:

((TreeView)sender).SelectedNode = e.Node; 
+0

鼠標事件參數沒有.Node – 2012-01-13 02:04:48

2

類似於馬庫斯的答案,這是我發現我工作的解決方案:你不必自己顯示上下文菜單

private void treeView_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     treeView.SelectedNode = treeView.GetNodeAt(e.Location); 
    } 
} 

,如果你其設置爲每個單獨的節點,像這樣:

TreeNode node = new TreeNode(); 
node.ContextMenuStrip = contextMenu; 

然後文本菜單的開幕活動裏面,TreeView.SelectedNode屬性將反映正確的節點。

6

振興這個問題,因爲我覺得這是一個更好的解決方案。 我改用NodeMouseClick事件。

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     tree.SelectedNode = e.Node; 
    } 
} 
0

下面是我該怎麼做。

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     e.Node.TreeView.SelectedNode = e.Node; 
} 
2

這是一個很老的問題,但我仍然覺得它很有用。我正在使用上述一些答案的組合,因爲我不想讓右鍵單擊的節點成爲selectedNode。如果我選擇了根節點並且希望刪除它的一個子節點,我不希望孩子在刪除它時選中(我還在selectedNode上做了一些工作,我不希望發生在右鍵菜單上)點擊)。這裏是我的貢獻:

// Global Private Variable to hold right-clicked Node 
private TreeNode _currentNode = new TreeNode(); 

// Set Global Variable to the Node that was right-clicked 
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     _currentNode = e.Node; 
} 

// Do something when the Menu Item is clicked using the _currentNode 
private void toolStripMenuItem_Clicked(object sender, EventArgs e) 
{ 
    if (_currentNode != null) 
     MessageBox.Show(_currentNode.Text); 
} 
0

,你可以與運行另一種選擇是有一個有選擇的節點的全局變量。你只需要使用TreeNodeMouseClickEventArgs

public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    _globalVariable = e.Node; 
} 

現在您可以訪問該節點及其屬性。