如何确定导致ContextMenuStrip的控件

时间:2012-10-16 05:46:53

标签: .net winforms

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

1 个答案:

答案 0 :(得分:0)

您可以使用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;
    }