【问题标题】:How to detrmine the control that cause ContextMenuStrip如何确定导致 ContextMenuStrip 的控件
【发布时间】:2012-10-16 05:46:52
【问题描述】:

我对 .NET 很陌生,我必须编写一个程序,其中有一个带有不同类型节点的 TreeView,每种节点都有不同的 ContextMenuStrip,所以我创建了多种 ContextMenuStrip,然后分配给不同的种树节点。现在我的问题是,当用户显示上下文菜单时,我应该如何找到哪个 TreeNode 是导致 ContextMenuStrip 显示的节点。我尝试使用ContextMenuStrip.SourceControl,但它返回一个TreeView,它对我没有帮助,因为我知道我的源是TreeView 我想知道视图的哪个节点!现在我应该使用某种命中测试吗?如果是的话,使用键盘显示的 ContextMenu 呢?

【问题讨论】:

标签: .net winforms


【解决方案1】:

您可以使用 Tag 属性来“链接”源节点。 例如,在表单的 Load 事件处理程序中:

    private void Form1_Load(object sender, EventArgs e)
    {
        TreeNode rootNode = treeView1.Nodes[0];        

        rootNode.Nodes[0].ContextMenuStrip = contextMenuStrip1;
        contextMenuStrip1.Tag = rootNode.Nodes[0];

        rootNode.Nodes[1].ContextMenuStrip = contextMenuStrip2;
        contextMenuStrip2.Tag = rootNode.Nodes[1];
    }

然后您可以将所有 ContextMenuStrip 控件的 Opened 事件处理程序绑定到一个方法,如下所示:

    private void contextMenuStrip_Opened(object sender, EventArgs e)
    {
        ContextMenuStrip cms = sender as ContextMenuStrip;
        TreeNode aNode = cms.Tag as TreeNode;
        if (aNode != null)
        {
            MessageBox.Show(aNode.Text);
        }
    }

可能有更好的方法来做到这一点,但我认为这应该能够解决你的问题。

2012 年 10 月 17 日更新:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            contextMenuStrip1.Tag = e.Node;
        }
    }

    private void contextMenuStrip1_Opened(object sender, EventArgs e)
    {
        ContextMenuStrip cms = sender as ContextMenuStrip;
        TreeNode aNode = cms.Tag as TreeNode;
        if (aNode == null)
        {
            aNode = treeView1.SelectedNode;
        }
        MessageBox.Show(aNode.Text);
    }

    private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
        ContextMenuStrip cms = sender as ContextMenuStrip;
        cms.Tag = null;
    }

【讨论】:

  • 这样,根据您的代码,我应该为十几个节点使用十几个 ContextMenuStrip !但我只有 ContextMenuStrip 每种类型的节点,这就是问题的根源
  • 我看不出一个和多个 ContextMenuStrip 控件之间的区别在哪里。使用使用 Tag 属性的相同方法,您应该对事件源有足够的控制权。或者,也许我错过了什么。如果你能显示一些代码,我可能知道问题出在哪里。
  • 当您有多个 ContextMenuStrip 时,您可以将每个 ContextMenuStrip 的 Tag 属性设置为特定节点,否则,您只有一个用于多个节点的 ContextMenuStrip。现在应该如何将 Tag 设置为适当的节点??
  • 我明白你的意思。我也读过 Hans Passant 和你的 cmets。我已经更新了我的答案。请查看新代码是否解决了您的问题(用户应该能够使用键盘和鼠标打开上下文菜单)。
  • 如果最终用户为菜单上的某个项目使用键盘加速器(例如,如果您在 ToolStripMenuItem 内的 ToolStripMenuItem 上设置了 ShortcutKeys 属性,则此解决方案不起作用@)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多