1. ホーム
  2. c#

[解決済み] ContextMenuStripがどのコントロールで使用されたかを判断する

2023-04-15 23:43:20

質問

私は ContextMenuStrip があり、それが複数の異なるリストボックスに割り当てられています。 私は ContextMenuStrip がクリックされたときに、どの ListBox が使用されています。 手始めに以下のようなコードを試してみましたが、うまくいきません。 その sender には正しい値がありますが、それを menuSubmitted に代入しようとすると、NULLになります。

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    ContextMenu menuSubmitted = sender as ContextMenu;
    if (menuSubmitted != null)
    {
        Control sourceControl = menuSubmitted.SourceControl;
    }
}

どんなヘルプでも結構です。ありがとうございます。

以下の支援を利用して、私はそれを理解しました。

private void MenuViewDetails_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            if (menuItem != null)
            {
                ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;

                if (calendarMenu != null)
                {
                    Control controlSelected = calendarMenu.SourceControl;
                }
            }
        }

どのように解決するのですか?

の場合 ContextMenu :

問題なのは sender パラメータが 項目 を指します。コンテキストメニューそのものではありません。

これは簡単な修正ですが、それぞれの MenuItem GetContextMenu メソッド で、どの ContextMenu がそのメニュー項目を含んでいることを示します。

コードを以下のように変更します。

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    // Try to cast the sender to a MenuItem
    MenuItem menuItem = sender as MenuItem;
    if (menuItem != null)
    {
        // Retrieve the ContextMenu that contains this MenuItem
        ContextMenu menu = menuItem.GetContextMenu();

        // Get the control that is displaying this context menu
        Control sourceControl = menu.SourceControl;
    }
}

については ContextMenuStrip :

を使用すると、若干状況が変わります。 ContextMenuStrip の代わりに ContextMenu . この2つのコントロールは互いに関連しておらず、一方のインスタンスを他方のインスタンスにキャストすることはできません。

先ほどと同様に 項目 が返されます。 sender パラメータで返されるので ContextMenuStrip を決定する必要があります。そのためには Owner プロパティ . 最後に SourceControl プロパティ を使用して、どのコントロールがコンテキストメニューを表示しているかを判断します。

コードをこのように修正します。

private void MenuViewDetails_Click(object sender, EventArgs e)
{
     // Try to cast the sender to a ToolStripItem
     ToolStripItem menuItem = sender as ToolStripItem;
     if (menuItem != null)
     {
        // Retrieve the ContextMenuStrip that owns this ToolStripItem
        ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
        if (owner != null)
        {
           // Get the control that is displaying this context menu
           Control sourceControl = owner.SourceControl;
        }
     }
 }