我在C#GUI应用程序中使用TreeView和TreeView.Nodes,并希望在树中的几个节点上使用右键单击功能。我搜索了很多但似乎SelectedNode仅对左键单击有效,并且没有任何东西可以捕获节点上的右键单击。我想在右键单击时向节点添加“添加”,“删除”,“重命名”等功能。请问任何指导?
谢谢, Viren
答案 0 :(得分: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;
}
您可能需要在表单上使用PointToClient或PointToScreen来适当地转换坐标。当上下文菜单出现在错误的位置时,您很快就会意识到是否需要它们。
答案 1 :(得分:0)
使用TreeView上的ContextMenuStrip属性添加上下文菜单。如果您不需要显示某些节点的菜单,您可以处理ContextMenuStrip的Opening事件以取消它显示自身 - 或者,您也可以从那里禁用某些菜单的选项。
编辑:抓取鼠标下的节点,在TreeView上处理MouseUp事件,并使用以下代码:
TreeNode nodeUnderMouse = tvMyTreeView.GetNodeAt(e.X, e.Y);