2008-12-16 20 views
16

Tengo varios cuadros de texto. Me gustaría hacer que el botón Enter actúe como pestaña. Para que cuando esté en un cuadro de texto, al presionar Enter me mueva al siguiente. ¿Podría decirme cómo implementar este enfoque sin agregar ningún código dentro de la clase de cuadro de texto (sin anulación, y así sucesivamente si es posible)?Cómo hacer que Enter en un TextBox actúe como botón TAB

+1

¿Es esta una web o una aplicación de formas de ganar? – kemiller2002

+0

Esta es una aplicación de Windows Forms –

+0

También soy esta consulta. Gracias por preguntar .. – Sagotharan

Respuesta

-1

Tomar una suposición:

// on enter event handler 
parentForm.GetNextControl().Focus(); 
-1

Me gustaría combinar lo Pharabus y arul respondieron así:

private void textBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
if (e.KeyChar == ‘\r’) 
{ 
e.Handled = true; 
parentForm.GetNextControl().Focus() 
} 
} 

Déjame saber si esto ayuda! JFV

+0

GetNextControl() toma 2 parámetros ... –

10

Puede escribir en la keyDown de cualquier control:

 if (e.KeyCode == Keys.Enter) 
     { 

      if (this.GetNextControl(ActiveControl, true) != null) 
      { 
       e.Handled = true; 
       this.GetNextControl(ActiveControl, true).Focus(); 

      } 
     } 

GetNextControl no funciona en Vista.

para que funcione con Vista, necesitará usar el siguiente código para reemplazar el this.GetNextControl ...:

System.Windows.Forms.SendKeys.Send("{TAB}"); 
+0

GetNextControl tampoco funciona en Windows 10. Use SendKeys.Send ("{TAB}"). –

4

No es necesario que haga una "enter gestor de eventos"

Todo lo que necesita hacer es realizar un evento KeyDown "central":

ejemplo

private void General_KeyDown(object sender, KeyPressEventArgs e) 
{ 
if (e.KeyCode == Keys.Enter) 
     { 

      if (this.GetNextControl(ActiveControl, true) != null) 
      { 
       e.Handled = true; 
       this.GetNextControl(ActiveControl, true).Focus(); 
      } 
     } 
} 

Entonces, todo lo que tiene que hacer es ir al diseñador, seleccione todas las cajas de texto con las que desea pasar EnterKey (selecciónelas manteniendo presionada la tecla Ctrl y haciendo clic en el cuadro de texto con el mouse), luego vaya a Eventos (trueno), busque Keydown y escriba dentro de General_KeyDown. Ahora todos los Textboxes seleccionados tendrán el mismo evento de keydown :) Esto hace que todo sea mucho más fácil, porque imagina un formulario con 100 cuadros de texto y quieres pasar por todos con enter .... haciendo un evento aparte para cada texbox es ... Bueno, no es una forma adecuada de hacer un programa, no es limpio. Espero que haya ayudado !!

cita en bloque

0

Para aquellos de ustedes que el código en VB ...

Public Class NoReturnTextBox 
    Inherits System.Windows.Forms.TextBox 

    Const CARRIAGE_RETURN As Char = Chr(13) 

    ' Trap for return key.... 
    Private Sub NoReturnTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 

     If e.KeyChar = CARRIAGE_RETURN Then 
      e.Handled = True 
      System.Windows.Forms.SendKeys.Send(vbTab) 
     End If 

    End Sub 

End Class 
1

Esto funcionó para mí

if (e.Key == Key.Enter) 
      ((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection())); 
+4

Sí, pero no necesita convertirlo a 'TextBox'. En vez de lanzarlo a 'UIElement', entonces puedes usar este método en cada control.También debe mencionar que esto solo está disponible en WPF y no en Winforms. – Oliver

+0

@Oliver: +1 por mencionar que solo está disponible para WPF, no para winforms. –

18

Este es el código que yo suelo usar . Debe estar en el evento KeyDown.

if (e.KeyData == Keys.Enter) 
{ 
    e.SuppressKeyPress = true; 
    SelectNextControl(ActiveControl, true, true, true, true); 
} 

ACTUALIZACIÓN

otra forma es enviando tecla "TAB"! Y anulando el método, haga que sea más fácil :)

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{    
    if (keyData == (Keys.Enter)) 
    { 
     SendKeys.Send("{TAB}"); 
    } 

    return base.ProcessCmdKey(ref msg, keyData); 
} 
+1

+1 Creo que 'SelectNextControl' es mejor que' GetNextControl' porque esto omitirá automáticamente Label, Panel, GroupBox, PictureBox, ProgressBar, Splitter y LinkLabel. Más información http://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol.aspx –

+0

+1 Porque 'SelectNextControl' hace que la tecla _Enter_ se comporte más como la tecla _Tab_ aquí, ya que también omita los controles donde 'TabStop' se establece en' false', si el tercer argumento se establece en 'true'. –

1

Si define el Orden de tabulación de todos los controles y crea el Formulario.TeclaDePresentaciónPreliminar = True, sólo se necesita lo siguiente:

Private Sub frmStart_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If e.KeyCode = Keys.Enter Then 
     System.Windows.Forms.SendKeys.Send("{TAB}") 
    End If 
End Sub 
2

Es importante tener en cuenta que si obtendrá un molesto "ding" o advertencia sonará cada vez que el control está esperando un control de botón asociado y no siempre es e.Handled = true la respuesta para deshacerte del ruido/sonido/ding.

Si el control (es decir, el cuadro de texto de línea única) espera un botón asociado para 'ENTRAR' su entrada, entonces también debe tratar el control 'faltante'.

e.Handled = e.SuppressKeyPress = true; 

Esto puede ser útil para deshacerse del sonido 'ding'.

Por lo que vale, en mi circunstancia, mis usuarios necesitaban utilizar la "TECLA INTRODUCIR" cuando estábamos pasando de una aplicación de terminal/pantalla verde a una aplicación de Windows y estaban más acostumbrados a "INGRESAR" mediante campos en lugar de tabbing.

Todos estos métodos funcionaron pero aún mantuvieron el sonido molesto hasta que agregué e.SuppressKeyPress.

0

utilizo este código en uno de los cuadro de texto keydown caso

if (e.KeyData == Keys.Enter) 
{ 
    e.SuppressKeyPress = true; 
    SelectNextControl(ActiveControl, true, true, true, true); 
} 

No puede manejar esta keydown evento para todos los cuadros de texto en mi forma. Sugiere algo. Gracias

+0

momento de escribir este código en forma de carga, pero no funcionó foreach (cont System.Windows.Forms.Control en this.Controls) { si (cont es TextBox) { cont.KeyDown + = new KeyEventHandler (esto .txtNo_KeyDown); } –

0

Esta es la solución que utilizo para VB.NET

  1. Establecer Keypreview = True en sus propiedades de formulario.

  2. poner este código en el evento de formulario keydown:

    Si (e.KeyData = Keys.Enter) Entonces

    'para cualquier control de multilínea, que tiene que salir a dejar de varias líneas' de introducción de texto 'presión de una tecla hace saltos de línea.

    If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub 
    
    e.SuppressKeyPress = True 
    SelectNextControl(ActiveControl, True, True, True, True) 
    

    End If

disfrutar !!!!

Xabier Aberasturi Larruzea

Cuestiones relacionadas