Определите, какой элемент управления использовался ContextMenuStrip - PullRequest
78 голосов
/ 03 февраля 2011

У меня есть ContextMenuStrip, который назначен нескольким различным спискам.Я пытаюсь выяснить, когда на ContextMenuStrip нажата кнопка, на которой ListBox она использовалась.Я попробовал приведенный ниже код в качестве начала, но он не работает.sender имеет правильное значение, но когда я пытаюсь присвоить его menuSubmitted, оно становится пустым.

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

Ответы [ 3 ]

108 голосов
/ 03 февраля 2011

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

Как и прежде, элемент , по которому щелкнули, все еще возвращается в параметре 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;
        }
     }
 }
3 голосов
/ 29 июля 2015

Старая запись, но в случае, если кто-то, как я, сталкивается с ней:

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

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

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

1 голос
/ 02 июля 2019

Мне было очень трудно заставить работать этот код. Это самое простое решение, которое я смог найти:

Для 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);
    }
...