确定使用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等,我只是发表一下。