2009-09-18 139 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