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