Determine en qué control se utilizó el ContextMenuStrip en

Tengo un ContextMenuStrip que está asignado a varios listboxes diferentes. Estoy tratando de averiguar cuándo se hace clic en ContextMenuStrip qué ListBox se utilizó. Probé el código a continuación como un comienzo, pero no está funcionando. El sender tiene el valor correcto, pero cuando trato de asignarlo al menuSubmitted , es nulo.

 private void MenuViewDetails_Click(object sender, EventArgs e) { ContextMenu menuSubmitted = sender as ContextMenu; if (menuSubmitted != null) { Control sourceControl = menuSubmitted.SourceControl; } } 

Cualquier ayuda sería genial. Gracias.

Usando la asistencia a continuación, lo descubrí:

 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; } } } 

Para un ContextMenu :

El problema es que el parámetro del sender apunta al elemento en el menú contextual que se hizo clic, no el menú contextual en sí.

Sin embargo, es una solución sencilla, ya que cada elemento de menú expone un método GetContextMenu que le indicará qué ContextMenu contiene ese elemento del menú.

Cambie su código a lo siguiente:

 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; } } 

Para un ContextMenuStrip :

Cambia ligeramente las cosas si usa un ContextMenuStrip lugar de un ContextMenu . Los dos controles no están relacionados entre sí, y una instancia de uno no se puede convertir en una instancia de la otra.

Al igual que antes, el elemento en el que se hizo clic todavía se devuelve en el parámetro del sender , por lo que tendrá que determinar el ContextMenuStrip que posee este elemento de menú individual. Lo haces con la propiedad del Owner . Finalmente, usará la propiedad SourceControl para determinar qué control muestra el menú contextual.

Modifique su código así:

 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; } } } 

Publicación anterior, pero en caso de que alguien como yo se encuentre con ella:

Para un ContextMenuStrip, lo anterior no funcionó para mí, pero me llevó a encontrar lo que hice.

 void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ContextMenuStrip menu = sender as ContextMenuStrip; Control sourceControl = menu.SourceControl; MessageBox.Show(sourceControl.Name); } 

Esto me dio el nombre del control esperado. Puedes poner validación, etc. con declaraciones if, solo estoy publicando para llegar al punto.