确定使用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; } } }
对于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; } } }
较早的post,但如果像我这样的人遇到它:
对于ContextMenuStrip而言,上述方法对我来说并不适用,但是它导致了我们find了什么。
void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ContextMenuStrip menu = sender as ContextMenuStrip; Control sourceControl = menu.SourceControl; MessageBox.Show(sourceControl.Name); }
这给了我预期的控制名称。 你可以在if语句中joinvalidation等,我只是发表一下。