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 イベント ハンドラーを 1 つのメソッドにバインドできます。

    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 に答える