Нажмите Enter, чтобы перейти к следующему элементу управления

У меня есть несколько TextBox на WinForm. Я хотел бы, чтобы фокус переместился к следующему элементу управления, когда нажата клавиша Enter? Всякий раз, когда текстовое поле получает контроль, он также выбирает текст, так что любое редактирование заменяет текущее.

Каков наилучший способ сделать это?

Ответ 1

Tab as Enter: создать пользовательский элемент управления, который наследует текстовое поле, переопределить метод KeyPress. Если пользователь нажимает кнопку ввода, вы можете либо позвонить SendKeys.Send("{TAB}"), либо System.Windows.Forms.Control.SelectNextControl(). Обратите внимание, что вы можете достичь того же, используя событие KeyPress.

Фокус. Весь текст: снова, через переопределение или события, настройте событие GotFocus, а затем вызовите метод TextBox.Select.

Ответ 2

Несколько примеров кода на С# с помощью SelectNextControl.

Первый переход к следующему элементу управления при нажатии ВВОД.

    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 );
        }
    }

Второй использует стрелки ВВЕРХ и ВНИЗ для перемещения по элементам управления.

    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 );
        }
    }

См. MSDN Выбрать методNextControl

Ответ 3

В событии KeyPress, если пользователь нажал Enter, вызовите

SendKeys.Send("{TAB}")

Самый простой способ реализовать автоматический выбор текста при получении фокуса - создать подкласс TextBox в вашем проекте со следующим переопределением:

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

Затем используйте этот пользовательский TextBox вместо стандартного текстового поля WinForms для всех ваших форм.

Ответ 4

Вы можете поместить обработчик KeyPress в свои текстовые поля и посмотреть, какой ключ был использован.

Чтобы обработать выбор текста, поместите обработчик в событие GotFocus.

Вы также можете рассмотреть, как (или если вам нужно) обрабатывать многострочные текстовые поля.

Ответ 5

Это может помочь:

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

Ответ 6

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();
    }

}

Ответ 7

Вы также можете написать свой собственный элемент управления для этого, если вы хотите использовать его чаще. Предполагая, что у вас несколько текстовых полей в гриде, это выглядит примерно так:

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;
            }
        }
    }
}

Ответ 8

Попробуйте использовать:

SendKeys.Send("{TAB}")