Principales respuestas
Problema menu contextual y MessageBox C# Visual Studio 2015

Pregunta
-
hola tengo el problema de que en ocasiones el menú contextual queda por encima del MessageBox haciendo que no se puede clickear sobre este, no se como hacer para ocultar el menú contextual una vez que se hace click ya que el evento click es quien muestra el messagebox
adjunto partes del código en cada evento
paso a explicar como tengo el código: primero tengo un datagrid donde capturo el evento click
private void AgendaSemanal_MouseClick(object sender, MouseEventArgs e)
{en este evento verifico si el click pulsado fue el derecho si es así entonces creo y muestro un menú contextual ,
al mostrarlo capturo el item clickeado con el evento
menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked);
}
public void menu_ItemClicked(object sender,ToolStripItemClickedEventArgs e) { //resumo el código del evento if (e.ClickedItem.Name=="CancelarTurno") { MessageBox.Show("Estas seguro de cancelar el turno?","Cancelar turno",MessageBoxButtons.YesNo,MessageBoxIcon.Exclamation); } }
Respuestas
-
Hola, esto pasa porque el evento al que estas subscribiendo "salta" antes de que el ContextMenuStrip sea cerrado, para tu problema se me ocurren dos soluciones:
Subscribir directamente los eventos a los items del menú contextual:
private void Form1_Load(object sender, EventArgs e) { ContextMenuStrip pacienteContextMenu = new ContextMenuStrip(); ToolStripMenuItem verPacienteMenuItem = new ToolStripMenuItem("Ver Paciente"); ToolStripMenuItem cancelarTurnoMenuItem = new ToolStripMenuItem("Cancelar Turno"); verPacienteMenuItem.Click += menuItem_Click; cancelarTurnoMenuItem.Click += menuItem_Click; pacienteContextMenu.Items.Add(verPacienteMenuItem); pacienteContextMenu.Items.Add(cancelarTurnoMenuItem); this.ContextMenuStrip = pacienteContextMenu; } private void menuItem_Click(object sender, EventArgs e) { var menuItem = (ToolStripMenuItem)sender; if (menuItem.Text == "Cancelar Turno") MessageBox.Show("Cancelar Turno"); }
Cerrar el menú contextual antes de mostrar el cuadro de dialogo:
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ((ContextMenuStrip)sender).Close(); if (e.ClickedItem.Name == "CancelarTurno") MessageBox.Show("Test"); }
- Marcado como respuesta Artemis Spectrum martes, 15 de mayo de 2018 16:13
Todas las respuestas
-
¿Por qué agrega el controlador del evento Click via código en tiempo de ejecución? ¿Lo remueve en algún momento? No suelo programar Forms, pero si el menú se reutiliza y usted no tiene código que remueva el controlador, entonces (creo que) tendrá múltiples instancias del código controlador corriendo. ¿Se le ha duplicado el MessageBox en algún momento?
Jose R. MCP
Code Samples -
Hola, esto pasa porque el evento al que estas subscribiendo "salta" antes de que el ContextMenuStrip sea cerrado, para tu problema se me ocurren dos soluciones:
Subscribir directamente los eventos a los items del menú contextual:
private void Form1_Load(object sender, EventArgs e) { ContextMenuStrip pacienteContextMenu = new ContextMenuStrip(); ToolStripMenuItem verPacienteMenuItem = new ToolStripMenuItem("Ver Paciente"); ToolStripMenuItem cancelarTurnoMenuItem = new ToolStripMenuItem("Cancelar Turno"); verPacienteMenuItem.Click += menuItem_Click; cancelarTurnoMenuItem.Click += menuItem_Click; pacienteContextMenu.Items.Add(verPacienteMenuItem); pacienteContextMenu.Items.Add(cancelarTurnoMenuItem); this.ContextMenuStrip = pacienteContextMenu; } private void menuItem_Click(object sender, EventArgs e) { var menuItem = (ToolStripMenuItem)sender; if (menuItem.Text == "Cancelar Turno") MessageBox.Show("Cancelar Turno"); }
Cerrar el menú contextual antes de mostrar el cuadro de dialogo:
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ((ContextMenuStrip)sender).Close(); if (e.ClickedItem.Name == "CancelarTurno") MessageBox.Show("Test"); }
- Marcado como respuesta Artemis Spectrum martes, 15 de mayo de 2018 16:13
-
Hola, esto pasa porque el evento al que estas subscribiendo "salta" antes de que el ContextMenuStrip sea cerrado, para tu problema se me ocurren dos soluciones:
Subscribir directamente los eventos a los items del menú contextual:
private void Form1_Load(object sender, EventArgs e) { ContextMenuStrip pacienteContextMenu = new ContextMenuStrip(); ToolStripMenuItem verPacienteMenuItem = new ToolStripMenuItem("Ver Paciente"); ToolStripMenuItem cancelarTurnoMenuItem = new ToolStripMenuItem("Cancelar Turno"); verPacienteMenuItem.Click += menuItem_Click; cancelarTurnoMenuItem.Click += menuItem_Click; pacienteContextMenu.Items.Add(verPacienteMenuItem); pacienteContextMenu.Items.Add(cancelarTurnoMenuItem); this.ContextMenuStrip = pacienteContextMenu; } private void menuItem_Click(object sender, EventArgs e) { var menuItem = (ToolStripMenuItem)sender; if (menuItem.Text == "Cancelar Turno") MessageBox.Show("Cancelar Turno"); }
Cerrar el menú contextual antes de mostrar el cuadro de dialogo:
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ((ContextMenuStrip)sender).Close(); if (e.ClickedItem.Name == "CancelarTurno") MessageBox.Show("Test"); }
me anduvo con la segunda, yo habia intentado hacer eso pero no sabia bien como, gracias
-
¿Por qué agrega el controlador del evento Click via código en tiempo de ejecución? ¿Lo remueve en algún momento? No suelo programar Forms, pero si el menú se reutiliza y usted no tiene código que remueva el controlador, entonces (creo que) tendrá múltiples instancias del código controlador corriendo. ¿Se le ha duplicado el MessageBox en algún momento?
el menú contextual solamente lo utilizo en las celdas del datagrid, es mas recomendable agregarlo en tiempo de diseño decís??
Jose R. MCP
Code Samples