2009-09-18 140 views
4

我在我的C#GUI應用程序中使用TreeView和TreeView.Nodes,並希望在我的樹中的幾個節點上使用右鍵單擊功能。我已經搜索了很多,但它似乎像SelectedNode只適用於左鍵單擊,並沒有什麼可以捕獲節點上的右鍵點擊。我想在右鍵單擊時添加諸如「添加」,「刪除」,「重命名」等功能。有任何指導嗎?TreeNode右鍵單擊選項

感謝, Viren

+0

您是使用Windows Forms還是WPF? – 2009-09-18 13:18:35

+0

是的窗體。對不起忘了提到這一點。和Visual Studio 2005. – zack 2009-09-18 13:20:51

回答

6

添加處理程序的MouseUp。 在處理程序中,檢查鼠標右鍵的參數,如果不是,則返回。 用鼠標座標調用treeView.GetNodeAt()來查找節點。 創建一個上下文菜單。

下面是它可以適應一個TreeView列表控制類似的東西:

 private void listJobs_MouseUp(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Right) 
      { 
       int index = listJobs.IndexFromPoint(e.Location); 
       if (index != ListBox.NoMatches) 
       { 
        listJobs.SelectedIndex = index; 

        Job job = (Job)listJobs.Items[index]; 

        ContextMenu cm = new ContextMenu(); 


        AddMenuItem(cm, "Run", QueueForRun, job).Enabled = !job.Pending; 
        AddMenuItem(cm, "Cancel run", CancelQueueForRun, job).Enabled = (job.State == JobState.Pending || job.State == JobState.Running); 
        AddMenuItem(cm, "Open folder", OpenFolder, job); 

        cm.Show(listJobs, e.Location); 
       } 
      } 
     } 

     private MenuItem AddMenuItem(ContextMenu cm, string text, EventHandler handler,  object context) 
     { 
      MenuItem item = new MenuItem(text, handler); 
      item.Tag = context; 
      cm.MenuItems.Add(item); 
      return item; 
     } 

您可能需要使用PointToClient或PointToScreen在表格上的座標適當翻譯。當上下文菜單出現在錯誤的地方時,您很快就會意識到是否需要它們。

+0

我嘗試使用您的代碼,它不起作用。我改變你的代碼,使我的簡單最初如下: 無效treeView1_MouseUp(對象發件人,發送MouseEventArgs E) { 如果(e.Button == MouseButtons.Right) { treeView1.SelectedNode = treeView1.GetNodeAt(當然, EY); Console.WriteLine(「右鍵單擊」); } } 即使這段簡單的代碼似乎並不奏效。你能指出確切的問題嗎?當我右鍵單擊樹中的某個節點時,甚至不會選擇該節點。 – zack 2009-09-18 14:30:36

+0

嘿謝謝斯科特。現在它工作正常。我忘了將自己編寫的事件處理程序註冊到我的GUI窗體應用程序中。我的錯。 – zack 2009-09-18 15:08:22

+0

不錯的工作。我很高興你解決了它。 – 2009-09-20 19:51:36

0

使用的ContextMenuStrip上TreeView的屬性添加上下文菜單。如果您不需要顯示某些節點​​的菜單,則可以處理ContextMenuStrip的「打開」事件以取消其顯示 - 或者,您也可以從中禁用某些菜單的選項。

編輯:搶鼠標下的節點,處理在TreeView控件MouseUp事件,並使用此代碼:

TreeNode nodeUnderMouse = tvMyTreeView.GetNodeAt(e.X, e.Y);
+0

MouseUp只是在開啓事件之後觸發,所以不起作用。似乎沒有辦法在顯示之前修改樹視圖中的上下文菜單。 – Nyerguds 2017-08-08 08:11:58