1:21 0 2
ComboBox y tecla ENTER en Windows Forms con Csharp

ComboBox y tecla ENTER en Windows Forms con Csharp

  DrUalcman |  julio 262017

Problemas difíciles, soluciones fáciles

Hoy he tenido problemas de nuevo con el tema de ejecutar una función cuando se presiona la tecla ENTER dentro de un ComboBox en una aplicaron Windows Forms utilizando c#.

Lo primero que piensas, al igual que en un TextBox es utilizar el Evento KeyPress y usar el mismo código que en el, algo así como

            if ((int)e.KeyChar == (int)Keys.Enter)
{
//aqui codigo
}

Pero en la practica esto no funciona dentro de un ComboBox.

La solución

Como no es la primera vez que me enfrento a esto, en esta ocasión quería intentar solucionarlo de la manera mas sencilla posible, ya que en otras ocasiones la verdad que me lié mucho. Pero conseguí dar con la solución. Internet a veces sirve para algo. 

Hay que sobrescribir el evento ProcessCmdKey y comprobar que el control activo es el ComboBox que tu deseas. Esto, en teoría, lo podrías hacer con todos los controles del formulario.

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((this.ActiveControl == ListPostCodes) && (keyData == Keys.Enter))
{
MessageBox.Show("Combo Enter");
return true;
}
else
{
return base.ProcessCmdKey(ref msg, keyData);
}
}

Como veis en el if se comprueba el control activo, por lo que con poner ahí el control que queréis que ejecute el procedimiento al presionar ENTER bastaría.

Happy coding


#trucos #CSHARP #windowsforms


2 Comentarios

    • Ivana
      domingo, 4 de junio de 2023 10:43

      Gracias. Justo lo que necesitaba!

    • DrUalcman-Programacion
      miércoles, 26 de julio de 2017 2:15

      Tambien se podria incluir la tecla RETURN, dependiendo del teclado es posible que devuelva otro codigo.

      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
      //capture the ENTER in a combobox
      if ((this.ActiveControl == ListPostCodes) && ((keyData == Keys.Enter) || (keyData == Keys.Return)))
      {
      GetCosts(ListPostCodes.Text);
      TexPostCodes.Text = "";
      return true;
      }
      else
      {
      return base.ProcessCmdKey(ref msg, keyData);
      }
      }

 
 
 

Archivo