Управление исходным кодом имеет значение null при доступе из пункта подконтекстного меню в С#

Я пытаюсь изменить цвет кнопки, когда они нажимают на элемент подменю (цвета> красный) из полосы контекстного меню.

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

Мой код:

private void redToolStripMenuItem_Click(object sender, EventArgs e)
{
    ToolStripItem subItem = sender as ToolStripItem;
    if (subItem == null) return;

    ToolStripItem mainItem = subItem.OwnerItem as ToolStripItem;
    if (mainItem == null) return;

    ContextMenuStrip menuStrip = mainItem.Owner as ContextMenuStrip;
    if (menuStrip == null) return;

    DataGridView dataGridView = menuStrip.SourceControl as DataGridView;
    if (dataGridView == null) return; //null here

    MessageBox.Show(dataGridView.Name);
}

Судя по тому, что я нашел в гугле, это ошибка. Есть ли обходные пути для этого?


person AustinWBryan    schedule 29.05.2015    source источник
comment
Просто используйте событие открытия ContextMenuStrip. Сохраните его SourceControl в переменной, чтобы вы могли использовать его позже.   -  person Hans Passant    schedule 29.05.2015
comment
Это сработало! Спасибо!   -  person AustinWBryan    schedule 29.05.2015
comment
Вот пример того, что stackoverflow.com/a/9739003/74585   -  person Matthew Lock    schedule 11.01.2017
comment
Привет, я пришел сюда с той же проблемой. Когда щелкается обычный (верхний уровень) пункт меню в контекстном меню, его Owner становится ContextMenuStrip, а его свойство SourceControl имеет ListView, но когда щелкается подменю (второго уровня), Owner является родительским меню (верхним). уровень), и даже когда я подхожу к ContextMenuStrip, его SourceControl равно нулю.   -  person Damn Vegetables    schedule 08.02.2017