2009-07-06 26 views
15

Tengo algunos TextBox en WinForm. Me gustaría que el foco se mueva al siguiente control cuando se presiona la tecla Entrar? Siempre que un cuadro de texto tenga control, también seleccionará el texto, de modo que cualquier edición reemplazará a la actual.Presione Enter para pasar al siguiente control

¿Cuál es la mejor manera de hacerlo?

Respuesta

27

Pestaña como Intro: crea un control de usuario que hereda el cuadro de texto, anula el método KeyPress. Si el usuario presiona ingresar, puede llamar al SendKeys.Send("{TAB}") o al System.Windows.Forms.Control.SelectNextControl(). Tenga en cuenta que puede lograr lo mismo utilizando el evento KeyPress.

Enfoque Texto completo: De nuevo, a través de anulación o eventos, meta el evento GotFocus y luego llame al método TextBox.Select.

+2

envío de pulsaciones de teclas no es la mejor solución cuando se proporciona un método para realizar la tarea. [SelectNextControl] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol.aspx) puede realizar la misma función que enviar el botón de tabulación sin el desorden de las teclas de envío. – Fr33dan

2

Puede colocar un controlador KeyPress en sus cuadros de texto y ver qué tecla se utilizó.

Para manejar la selección de texto, coloque un controlador en el evento GotFocus.

También es posible que desee considerar cómo (o si es necesario) manejar cuadros de texto multilínea.

10

En un evento KeyPress, si el usuario pulsa Enter, llame

SendKeys.Send("{TAB}") 

manera más agradable para implementar automáticamente seleccionando el texto al recibir el foco es crear una subclase de cuadro de texto en su proyecto con la siguiente anulación:

Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs) 
    SelectionStart = 0 
    SelectionLength = Text.Length 
    MyBase.OnGotFocus(e) 
End Sub 

A continuación, utilice este cuadro de texto personalizado en lugar del cuadro de texto estándar WinForms en todas sus formas.

2

Esto puede ayudar:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    // 
    // Detect the KeyEventArg's key enumerated constant. 
    // 
    if (e.KeyCode == Keys.Enter) 
    { 
     MessageBox.Show("You pressed enter! Good job!"); 
    } 
} 
+0

Esto es solo parte de una respuesta ... –

20

Un par de ejemplos de código en C# usando SelectNextControl.

Los primeros se mueve al siguiente control cuando ENTER se presiona.

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return)) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

El segundo utiliza los UP y ABAJO flechas para moverse a través de los controles.

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Up) 
     { 
      this.SelectNextControl((Control)sender, false, true, true, true); 
     } 
     else if(e.KeyCode == Keys.Down) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

Ver MSDN SelectNextControl Method

+0

Mi respuesta favorita. Esto supone que el desarrollador ha establecido correctamente las propiedades TabStop y TabIndex para los controles que siempre deben hacer. – user3902302

+0

Si desea aplicar esto en todos los controles del formulario actual, puede establecer los formularios con la propiedad KeyPreview en True, registrarse en el evento KeyUp del formulario y reemplazar "Sender (Control)" con "ActiveControl" en el código anterior. –

0

También podría escribir su propio control para esto, en caso de que desee utilizar esto más a menudo. Asumiendo que tiene múltiples cuadros de texto en una cuadrícula, se vería algo como esto:

public class AdvanceOnEnterTextBox : UserControl 
{ 

    TextBox _TextBox; 
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null); 
    public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null); 


    public AdvanceOnEnterTextBox() 
    { 
     _TextBox = new TextBox(); 
     _TextBox.KeyDown += customKeyDown; 
     Content = _TextBox; 

    } 


    /// <summary> 
    /// Text for the TextBox 
    /// </summary> 
    public String Text 
    { 
     get { return _TextBox.Text; } 
     set { _TextBox.Text = value; } 
    } 


    /// <summary> 
    /// Inputscope for the Custom Textbox 
    /// </summary> 
    public InputScope InputScope 
    { 
     get { return _TextBox.InputScope; } 
     set { _TextBox.InputScope = value; } 
    } 


    void customKeyDown(object sender, KeyEventArgs e) 
    { 
     if (!e.Key.Equals(Key.Enter)) return; 

     var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox; 
     if (element != null) 
     { 
      int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element); 
      try 
      { 
       // Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween). 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus(); 
      } 
      catch (Exception) 
      { 
       // Close Keypad if this was the last AdvanceOnEnterTextBox 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false; 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true; 
      } 
     } 
    } 
} 
+0

Puede hacer esto, por supuesto, sin embargo, tener un único método en la forma es mucho más fácil que volver a escribir todos los controles que va a utilizar, lo que llevará a tener una base de código masiva, y depurarlos más tarde. – AaA

0

Trate de usar:

SendKeys.Send("{TAB}") 
1
private void txt_invoice_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_date.Focus(); 
    } 

    private void txt_date_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_patientname.Focus(); 
    } 

}

Cuestiones relacionadas