Определите, какой элемент управления использовался ContextMenuStrip

У меня есть 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;
                }
            }
        }

6 ответов

Решение

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

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

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

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

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

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

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

Передайте отправителя в ToolStripItem, чтобы достичь владельца, которым будет ToolStrip, у которого нет свойства SourceControl.

Приведите владельца к ContextMenuStrip, чтобы получить доступ к SourceControl.

      Control sc = ((ContextMenuStrip)((ToolStripItem)sender).Owner).SourceControl;

Как насчет использования ActiveForm.ActiveControl в этом примере из сетки C1:

      C1.Win.FlexGrid.C1FlexGrid fg = frmMain.ActiveForm.ActiveControl as C1.Win.FlexGrid.C1FlexGrid;

Самым простым решением было бы:

Control parentControl = ((sender as MenuItem).GetContextMenu()).SourceControl;
 
Другие вопросы по тегам