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