web-dev-qa-db-ja.com

ContextMenuStripが使用されたコントロールを決定します

いくつかの異なるリストボックスに割り当てられた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;
                }
            }
        }
80
Taryn

ContextMenuの場合:

問題は、senderパラメーターが、コンテキストメニュー自体ではなく、クリックされたコンテキストメニューのitemを指していることです。

ただし、各MenuItemGetContextMenu method を公開し、どの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つのコントロールは互いに関連しておらず、一方のインスタンスを他方のインスタンスにキャストすることはできません。

以前と同様に、クリックされたitemsenderパラメーターで返されるため、ContextMenuStripこの個々のメニュー項目を所有しています。 Ownerプロパティ でそれを行います。最後に、 SourceControl property を使用して、コンテキストメニューを表示しているコントロールを決定します。

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

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;
        }
     }
 }
113
Cody Gray

古い投稿ですが、私のような誰かがそれに出くわした場合:

ContextMenuStripの場合、上記は私には機能しませんでしたが、何が機能するかを見つけることになりました。

void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    ContextMenuStrip menu = sender as ContextMenuStrip;
    Control sourceControl = menu.SourceControl;
    MessageBox.Show(sourceControl.Name);
}

これにより、予想されるコントロールの名前がわかりました。 ifステートメントを使用して検証などを行うことができます。要点を説明するために投稿しています。

3
seanu13

このコードを機能させるのは非常に困難でした。これは私が見つけることができる最も簡単な解決策です:

ContextMenuStripの場合:

    Control _sourceControl = null;
    private void contextMenuStrip_Opened(object sender, EventArgs e)
    {
        _sourceControl = contextMenuStrip.SourceControl;
    }

    private void contextMenuItem_Click(object sender, EventArgs e)
    {
        var menuItem = (ToolStripMenuItem)sender;

        _sourceControl.Text = menuItem.Text;
        MessageBox.Show(menuItem.Name);
        MessageBox.Show(sourceControl.Name);
    }
1
Nick Allan