Получить исходный контроль DropDownMenu - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть два события щелчка пунктов меню в полосе контекстного меню. Я могу получить управление исходным кодом элемента контекстного меню, по которому щелкнули, выполнив этот код:

Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;

Снимок экрана пункта контекстного меню

Но когда я использую этот код в элементе контекстного меню, который находится на другом уровне, он возвращает ноль.

Снимок экрана элемента контекстного меню на другом уровне

Как получить sourcecontrol в событии click пункта меню второго снимка экрана?

1 Ответ

0 голосов
/ 12 ноября 2018

ContextMenuStrip SourceControl (ссылка на текущий элемент управления, в котором активировано контекстное меню) можно получить из ToolStripMenuItem , проверяя * 1007 Ссылка * OwnerItem и перемещение вверх по течению, пока ссылка OwnerItem не станет равной null, затем проверка значения Владелец , который ссылается на ContextMenuStrip.
(К сожалению, ссылка SourceControl доступна только в элементе управления ContextMenuStrip).

Простой альтернативный метод - использование Field, которое ссылается на Control, где был активирован текущий ContextMenuStrip (у вас может быть только один активный ContextMenuStrip).
Ссылка на это поле, установленная при открытии ContextMenuStrip - путем подписки на событие Opened() - может быть доступна любому из ToolStripMenuItem.
После этого для задания поля устанавливается значение null, когда ContextMenuStrip закрывается.

Пример :
(toolStripMenuItem - это общее имя, оно должно быть установлено на фактическое имя элемента управления).

Control CurrentContextMenuOwner = null;

private void contextMenuStrip1_Opened(object sender, EventArgs e)
{
    CurrentContextMenuOwner = (sender as ContextMenuStrip).SourceControl;
}

private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    CurrentContextMenuOwner.BackColor = Color.Blue;
    //(...)
}

private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
    CurrentContextMenuOwner = null;
}
...