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

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

===============>>#1 票数:88 已采纳

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

===============>>#2 票数:20

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

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

===============>>#3 票数: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 );
           }
        }
     }
  }

===============>>#4 票数:7

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

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

===============>>#5 票数:2

与Marcus的回答类似,这是我发现为我工作的解决方案:

private void treeView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        treeView.SelectedNode = treeView.GetNodeAt(e.Location);
    }
}

如果将其设置为每个单独的节点,则无需自己显示上下文菜单,如下所示:

TreeNode node = new TreeNode();
node.ContextMenuStrip = contextMenu;

然后在ContextMenu的Opening事件中,TreeView.SelectedNode属性将反映正确的节点。

===============>>#6 票数:2

这是一个非常古老的问题,但我仍然发现它很有用。 我正在使用上面一些答案的组合,因为我不希望右键单击的节点成为selectedNode。 如果我选择了根节点并想要删除其中一个子节点,我不希望在删除它时选择该子节点(我也在selectNode上做一些我不希望在右边进行的工作 - 点击)。 这是我的贡献:

// Global Private Variable to hold right-clicked Node
private TreeNode _currentNode = new TreeNode();

// Set Global Variable to the Node that was right-clicked
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        _currentNode = e.Node;
}

// Do something when the Menu Item is clicked using the _currentNode
private void toolStripMenuItem_Clicked(object sender, EventArgs e)
{
    if (_currentNode != null)
        MessageBox.Show(_currentNode.Text);
}

===============>>#7 票数:0

我就是这样做的。

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}

===============>>#8 票数:0

您可以运行的另一个选项是拥有一个具有所选节点的全局变量。 您只需要使用TreeNodeMouseClickEventArgs

public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e)
{
    _globalVariable = e.Node;
}

现在您可以访问该节点及其属性。

===============>>#9 票数:0

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

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

  ask by Sam translate from so

未解决问题?本站智能推荐: