У меня есть, 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;
}
}
}
c#
.net
winforms
contextmenustrip
Тарин
источник
источник
if
операторы и не использовать их,if (menuItem == null) return;
если вы похожи на меня и не хотите, чтобы ваш код, который его обрабатывает, был вложен в дополнительные ненужные 2 уровня.Ответы:
Для
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; } } }
источник
ContextMenu
иContextMenuStrip
. (Ах, и я вижу, что вы уже поняли это. Что ж, тем лучше научиться чему-то самому!)SourceControl
сожалению , имеет значение null в момент запускаClick
событияToolStripItem
подпунктаContextMenuStrip
. Кажется , чтоContextMenuStrip
«SClosed
событие срабатывает до этогоClick
события, которое, вероятно , что вызывает проблему; Я предполагаю, что свойство очищается после закрытия меню.OwnerItem
свойств, пока не найдетеToolStripItem
,ContextMenuStrip
вOwner
свойстве которого есть a . Но, как я только что прокомментировал, это не работает; вSourceControl
контекстном меню будет пусто. Вы сказали, что не можете воспроизвести это ... может проблема возникает только с меню глубже одного уровня? У меня было два подуровня.Предыдущий пост, но на случай, если кто-то вроде меня наткнется на него:
Для ContextMenuStrip это не сработало для меня, но привело к обнаружению того, что сработало.
void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ContextMenuStrip menu = sender as ContextMenuStrip; Control sourceControl = menu.SourceControl; MessageBox.Show(sourceControl.Name); }
Это дало мне имя ожидаемого элемента управления. Вы можете включить проверку и т. Д. С помощью операторов if, я просто публикую, чтобы перейти к сути.
источник
ContextMenu
. Проблема в том, чтоItemClicked
не срабатывает при нажатии на пункты подменю ; им нужно собственноеClick
событие, в котором отправителем будет сам элемент, а не меню.Мне было очень трудно заставить любой из этих кодов работать. Это самое простое решение, которое я смог найти:
Для 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); }
источник
Самым простым решением было бы:
Control parentControl = ((sender as MenuItem).GetContextMenu()).SourceControl;
источник