none
Problema menu contextual y MessageBox C# Visual Studio 2015 RRS feed

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


    martes, 15 de mayo de 2018 5:34

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

    martes, 15 de mayo de 2018 14:43

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

    martes, 15 de mayo de 2018 7:33
    Moderador
  • 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");
            }

    martes, 15 de mayo de 2018 14:43
  • 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

    martes, 15 de mayo de 2018 16:13
  • ¿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

    el menú contextual solamente lo utilizo en las celdas del datagrid, es mas recomendable agregarlo en tiempo de diseño decís??
    martes, 15 de mayo de 2018 16:14