88

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;
                }
            }
        }
4

6 に答える 6

132

の場合ContextMenu:

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

ただし、それぞれがそのメニュー項目を含むメソッドMenuItemを公開しているため、簡単な修正です。GetContextMenuContextMenu

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

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の代わりに aを使用すると、状況が少し変わります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;
        }
     }
 }
于 2011-02-03T12:56:23.477 に答える
0

C1グリッドからのこの例では、ActiveForm.ActiveControlを使用するだけではどうですか:

C1.Win.FlexGrid.C1FlexGrid fg = frmMain.ActiveForm.ActiveControl as C1.Win.FlexGrid.C1FlexGrid;
于 2021-06-07T19:19:07.793 に答える
0

最も簡単な解決策は次のとおりです。

Control parentControl = ((sender as MenuItem).GetContextMenu()).SourceControl;
 
于 2020-07-16T12:23:57.407 に答える