TreeNode右键单击选项

zac*_*ack 4 c# tree-nodes winforms

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

谢谢,Viren

Sco*_*ham 6

为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;
        }
Run Code Online (Sandbox Code Playgroud)

您可能需要在表单上使用PointToClient或PointToScreen来适当地转换坐标.当上下文菜单出现在错误的位置时,您很快就会意识到是否需要它们.