martes, 21 de abril de 2015

Windows Forms. El puntero del ratón desaparece.

El control ComboBox toma el control de todos los eventos del ratón del formulario cuando se despliega el problema es que no inicializa el cursor del ratón por lo que, hasta que se cierra el desplegable, se mantiene el mismo cursor que se encontraba activo y, si estaba oculto, directamente no se muestra.


Reproduciendo el problema


Podemos reproducir el problema creando un nuevo formulario Form1 en una aplicación de escritorio Windows Forms. En el formulario incluimos dos controles: un control TextBox con nombre textBox1 y un ComboBox con nombre comboBox1.

En el evento KeyDown del TextBox introducimos código para que se despliegue el ComboBox:

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                comboBox1.DroppedDown = true;
            }
        }
    Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles textBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            comboBox1.DroppedDown = True
        End If
    End Sub

Si arrancamos el formulario e introducimos texto en el control TextBox veremos que el puntero del ratón desaparece. Si finalizamos la edición pulsando la tecla Enter se desplegará el control ComboBox. Pero si movemos el ratón por el formulario veremos que el puntero no aparece hasta que no pulsamos alguno de los botones, con lo que se cierra el desplegable.



Workaround


Aunque nos podemos volver locos buscando soluciones a este problema, en realidad la complejidad está únicamente en comprender el problema. Como he comentado el problema está en que el control ComboBox no inicializa el cursor cuando toma el control de los eventos del ratón al desplegar la lista. Por lo tanto para solucionarlo simplemente necesitamos inicializarlo nosotros estableciendo el cursor en el evento DropDown del ComboBox.

        private void comboBox1_DropDown(object sender, EventArgs e)
        {
            this.Cursor = Cursors.Arrow;
        }
    Private Sub comboBox1_DropDown(sender As Object, e As EventArgs) Handles comboBox1.DropDown
        Me.Cursor = Cursors.Arrow
    End Sub

2 comentarios:

  1. Hola, buenos días.

    He creado un objeto al que llamo miCombo en el cual combino un textbox y un combobox para que conforme escribimos en el textbox nos vaya filtrando y nos muestre en el desplegable solo aquellos item que contengan lo que estamos escribiendo en el textbox.

    Si tengo el puntero sobre miCombo al empezar a escribir no hay ningún problema, me mantiene el puntero, pero si al empezar a escribir el puntero se encuentra fuera de mi control desaparece el puntero. Vuelve a aparecer como has comentado, al pulsar algún botón.

    Gracias de antemano y un saludo =)

    ResponderEliminar
    Respuestas
    1. Hola Pablo,
      me alegro de que te haya ayudado.
      Por lo que comentas del control que estás creando puede que también te sirva de ayuda el artículo Windows Forms. TextBox con sugerencias

      Un saludo

      Eliminar