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

Sam*_*Sam 69 c# treeview contextmenu winforms

如何找出树列表中的哪个节点已激活上下文菜单?例如,右键单击节点并从菜单中选择一个选项.

我无法使用TreeViews的SelectedNode属性,因为该节点只是右键单击而未选中.

Jon*_*tor 91

您可以将鼠标单击事件添加到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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我对解决方案有一点补充:您还可以使用"_NodeMouseClick"事件,它会为您提供"TreeNodeMouseClickEventArgs e",在这种情况下,您只需使用e.Node,而不必费心去检查该节点是否为空. (6认同)

dee*_*eej 20

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

 ((TreeView)sender).SelectedNode = e.Node;
Run Code Online (Sandbox Code Playgroud)

  • 是的,但TreeNodeMouseClickEventArgs(传递到**NodeMouseClick**事件)做.所以我的解决方案是有效的,而不像其他解决方案那样过于复杂 (2认同)

小智 12

我发现标准的windows treeview行为选择行为非常烦人.例如,如果您使用资源管理器并右键单击某个节点并单击"属性",则会突出显示该节点并显示您单击的节点的属性对话框.但是当您从对话框返回时,突出显示的节点是先前选择/突出显示的节点,然后才能进行右键单击.我发现这会导致可用性问题,因为我对我是否对正确的节点采取行动感到困惑.

因此,在我们的许多GUI中,我们在右键单击时更改选定的树节点,这样就不会产生混淆.这可能与Explorer之类的标准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 );
           }
        }
     }
  }
Run Code Online (Sandbox Code Playgroud)


Bet*_*tin 7

重新回答这个问题,因为我发现这是一个更好的解决方案.我改用NodeMouseClick事件.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Run Code Online (Sandbox Code Playgroud)