Определите, на каком элементе управления использовался 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;
                }
            }
        }
2 71

2 ответа:

на ContextMenu:

проблема в том, что sender параметр указывает на item в контекстном меню, которое было нажато, а не в самом контекстном меню.

это простое решение, хотя, потому что каждый 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. Эти два элемента управления не связаны друг с другом, и экземпляр одного не может быть приведен к экземпляру другого.

как и прежде, item что было нажато по-прежнему возвращается в

старый пост, но в случае, если кто-то вроде меня натыкается на него:

для ContextMenuStrip, выше не работает для меня, но это привело к поиску того, что сделал.

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

Это дало мне имя ожидаемого элемента управления. Вы можете ввести проверку и т. д. С помощью операторов if, я просто публикую, чтобы добраться до сути.