Uso de PreviewKeyDown u otro control de teclas.

08/12/2008 - 12:14 por Tomas | Informe spam
Hola a todos.

Posiblemente la duda que planteo sea de novato, pero no termino de dar con
la solución.

Tengo un formulario WinForm, con controles tipo botón y cajas de texto.

Lo que pretendía conseguir es capturar la pulsación de la tecla RETURN y
convertirla en TAB, si el foco se encuentra en una caja de texto, para que
pase al siguiente campo. Si se encuentra en un control botón, pues que se
ejecute la acción de ése botón.

En el formulario tengo asignada la propiedad KeyPreview = true.

Luego he generado la función para que capture el evento de la pulsación de
teclas antes de que llegue a los controles, (o eso entiendo que hace y si
no, es lo que yo pretendo):

private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
Debug.WriteLine("PreviewKeyDown()");
}

Pero a esta función nunca llega nada, seguramente estoy pasando algo por
alto, pero no termino de dar con la solución.

Si alguien ve donde me estoy equivocando le agradecería me orientase hacia
el camino de la solución.

Gracias por anticipado.
Tomás.
 

Leer las respuestas

#1 SoftJaén
08/12/2008 - 17:04 | Informe spam
"Tomas" escribió:

Tengo un formulario WinForm, con controles tipo botón y cajas de texto.

Lo que pretendía conseguir es capturar la pulsación de la tecla RETURN y
convertirla en TAB, si el foco se encuentra en una caja de texto, para que
pase al siguiente campo. Si se encuentra en un control botón, pues que se
ejecute la acción de ése botón.

En el formulario tengo asignada la propiedad KeyPreview = true.



Hola, Tomás:

Si lo que pretendes hacer es desplazar el foco entre los distintos controles
TextBox mediante la tecla Return, tienes que hacer uso del método
«GetNextControl» de la clase Form, el cual te devuelve el siguiente o el
anterior control existente en el orden de tabulación de los controles que
hayas establecido, de ahí que sea importante que establezcas bien el orden
de tabulación de los controles existentes en el formulario.

Una vez que hayas asignado el valor «true» a la propiedad «KeyPreview» del
formulario, en su evento «KeyDown» ejecutarías lo siguiente:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
Control ctrl = this.ActiveControl;

do
{
// Obtener el siguiente control hacia delante en el
// orden de tabulación.
ctrl = this.GetNextControl(ctrl, true);

if ((ctrl != null) && ctrl.CanFocus && ctrl.TabStop)
{
// Si el control puede recibir el foco, se lo doy.
ctrl.Focus();
e.Handled = true;
break;
}
}
while (true);
}

Por último, para evitar el pitido que se produce cuando pulsas la tecla
«Enter», ejecuta lo siguiente en el evento «KeyPress» del formulario:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
// Si la tecla pulsada es la tecla Intro ...
if (e.KeyChar == Convert.ToChar(Keys.Return))

// ... evito el pitido
e.Handled = true;
}

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Preguntas similares