【问题标题】:TreeNode Right Click OptionTreeNode 右键单击​​选项
【发布时间】:2010-11-29 11:48:37
【问题描述】:

我在我的 C# GUI 应用程序中使用 TreeView 和 TreeView.Nodes,并希望在我的树中的几个节点上使用右键单击功能。我已经搜索了很多,但似乎 SelectedNode 仅对左键单击有效,并且没有任何内容可以捕获节点上的右键单击。我想在右键单击时向节点添加“添加”、“删除”、“重命名”等功能。请问有什么指导吗?

谢谢, 维伦

【问题讨论】:

  • 您使用的是 Windows 窗体还是 WPF?
  • 是的 windows 窗体。抱歉忘记提了。还有 Visual Studio 2005。

标签: c# winforms tree-nodes


【解决方案1】:

为 MouseUp 添加一个处理程序。 在处理程序中,检查 args 是否有鼠标右键,如果不是则返回。 使用鼠标坐标调用 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 来适当地转换坐标。当上下文菜单出现在错误的位置时,您很快就会意识到是否需要它们。

【讨论】:

  • 我尝试使用您的代码,但它不起作用。我更改您的代码以使我最初更简单如下: void treeView1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); Console.WriteLine("右击"); } } 即使是这段简单的代码似乎也不起作用。你能指出确切的问题吗?当我右键单击树中的一个节点时,它甚至没有选择该节点。
  • 嘿,谢谢斯科特。它现在工作正常。我忘记在我的 GUI 表单应用程序中注册我自己编写的事件处理程序。我的错。
【解决方案2】:

使用 TreeView 上的 ContextMenuStrip 属性添加上下文菜单。如果您需要不显示某些节点​​的菜单,您可以处理 ContextMenuStrip 的 Opening 事件以取消其显示自身 - 或者,您也可以从那里禁用某些菜单选项。

编辑:抓取鼠标下的节点,处理 TreeView 上的 MouseUp 事件,并使用以下代码:

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

【讨论】:

  • MouseUp 仅在打开事件后触发,因此不起作用。似乎没有办法在显示之前调整树视图中包含的上下文菜单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多