0

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

4

1 回答 1

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;
    }
于 2012-10-16T11:03:40.417 回答