我有一个 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;
}
}
}
最佳答案
对于 ContextMenu
:
问题是 sender
参数指向被单击的上下文菜单上的项目,而不是上下文菜单本身。
不过,这是一个简单的修复,因为每个 MenuItem
都会暴露一个 GetContextMenu
method,它会告诉您哪个 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
property 做到这一点。最后,您将使用 SourceControl
property 来确定哪个控件正在显示上下文菜单。像这样修改你的代码:
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;
}
}
}
关于c# - 确定 ContextMenuStrip 用于哪个控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4886327/