查找上下文菜单下单击的节点

时间:2020-03-05 18:37:47  来源:igfitidea点击:

如何找到上下文菜单已被激活的树形列表中的哪个节点?例如,右键单击节点,然后从菜单中选择一个选项。

我不能使用TreeViews的" SelectedNode"属性,因为仅右键单击该节点,未选择该节点。

解决方案

回答

我们可以将鼠标单击事件添加到TreeView中,然后在给定MouseEventArgs提供的鼠标坐标的情况下,使用GetNodeAt选择正确的节点。

void treeView1MouseUp(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        // Select the clicked node
        treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

        if(treeView1.SelectedNode != null)
        {
            myContextMenuStrip.Show(treeView1, e.Location);
        }
    }
}

回答

如果我们希望上下文菜单依赖于所选项目,那么我认为最好是使用Jonesinator的代码来选择单击的项目。然后,上下文菜单内容可以取决于所选项目。

首先选择项目,而不是仅将其用于上下文菜单会带来一些好处。第一个是用户对他单击了哪个按钮以及菜单与哪个项目相关联具有视觉指示。第二个是,通过这种方式与其他调用上下文菜单的方法(例如键盘快捷键)保持兼容要容易得多。

回答

我发现标准Windows Treeview行为选择行为非常烦人。例如,如果我们正在使用资源管理器,然后右键单击某个节点并单击"属性",它将突出显示该节点并显示我们单击的节点的属性对话框。但是,当我们从对话框中返回时,突出显示的节点是在单击鼠标右键之前先前选择/突出显示的节点。我发现这会导致可用性问题,因为我一直困惑于我是否在正确的节点上行动。

因此,在许多GUI中,我们都可以通过右键单击更改选定的树节点,以免造成混淆。这可能与资源管理器之类的标准iwndos应用程序不同(出于方便的原因,我倾向于在标准窗口应用程序之后强烈地对我们的GUI行为进行建模),我相信这一例外情况会导致更多可用的树。

这是一些在右键单击期间更改选择的代码:

private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  {
     // only need to change selected note during right-click - otherwise tree does
     // fine by itself
     if ( e.Button == MouseButtons.Right )
     {         
        Point pt = new Point( e.X, e.Y );
        tree.PointToClient( pt );

        TreeNode Node = tree.GetNodeAt( pt );
        if ( Node != null )
        {
           if ( Node.Bounds.Contains( pt ) )
           {
              tree.SelectedNode = Node;
              ResetContextMenu();
              contextMenuTree.Show( tree, pt );
           }
        }
     }
  }

回答

这是我的解决方案。将此行放入TreeView的NodeMouseClick事件中:

((TreeView)sender).SelectedNode = e.Node;