Определите, какой элемент управления использовался 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;