Как заставить Enter в TextBox действовать как кнопка TAB - PullRequest
20 голосов
/ 16 декабря 2008

У меня есть несколько текстовых полей. Я хотел бы, чтобы кнопка Enter действовала как Tab. Так что, когда я попаду в одно текстовое поле, нажатие Enter переместит меня к следующему. Не могли бы вы рассказать мне, как реализовать этот подход без добавления кода внутри класса текстового поля (без переопределения и т. Д., Если возможно)?

Ответы [ 12 ]

20 голосов
/ 22 июля 2012

Вот код, который я обычно использую. Должно быть в событии KeyDown.

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

UPDATE

Другим способом является отправка клавиши "TAB"! А переопределение метода облегчает задачу:)

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

    return base.ProcessCmdKey(ref msg, keyData);
}
11 голосов
/ 16 декабря 2008

Вы можете написать на keyDown любого элемента управления:

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

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

            }
        }

GetNextControl не работает на Vista .

Чтобы она работала с Vista, вам нужно использовать приведенный ниже код для замены this.GetNextControl ...:

System.Windows.Forms.SendKeys.Send("{TAB}");
4 голосов
/ 02 февраля 2009

Вам не нужно создавать «обработчик события ввода»

Все, что вам нужно сделать, это сделать "центральное" событие KeyDown:

Пример

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

Затем все, что вам нужно сделать, это перейти к дизайнеру, выбрать все текстовые поля, по которым вы хотите перейти с помощью EnterKey (выберите их, удерживая нажатой клавишу Ctrl и щелкнув текстовое поле с помощью мыши), затем перейдите в раздел «События» (кнопка грома как) и найдите Keydown событие и тип внутри General_KeyDown. Теперь все выбранные текстовые поля будут иметь одно и то же событие нажатия клавиш :) Это намного облегчает все, потому что представьте форму с 100 текстовыми полями, и вы хотите циклически пройтись по всему с помощью ввода .... создание отдельного события для каждого текстового поля это .. Ну, это не правильный способ сделать программу, это не аккуратно. Надеюсь, это помогло !!

Blockquote

3 голосов
/ 13 октября 2014

Важно отметить, что если вы будете слышать раздражающий «динг» или предупреждающий звук каждый раз, когда элемент управления ожидает соответствующий элемент управления, а e.Handled = true не всегда является решением, чтобы избавить себя от шума / звука /ding.

Если элемент управления (т. Е. Однострочное текстовое поле) ожидает, что соответствующая кнопка «ВВОДИТ» вашу запись, вы также должны иметь дело с «отсутствующим» элементом управления.

e.Handled = e.SuppressKeyPress = true;

Это может быть полезно при избавлении от звука "динь".

Для чего бы это ни стоило - в моих обстоятельствах моим пользователям нужно было использовать «КЛАВИШУ ВВОДА», когда мы переходили от приложения терминала / зеленого экрана к приложению Windows, и они больше привыкли «вводить» через поля вместо табуляции.

Все эти методы работали, но продолжали раздражать, пока я не добавил e.SuppressKeyPress.

1 голос
/ 20 февраля 2014

Если вы определяете Tab Tab всех элементов управления и делаете Form.KeyPreview = True, нужно только это:

    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
1 голос
/ 15 декабря 2011

Это сработало для меня

if (e.Key == Key.Enter)
            ((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
0 голосов
/ 21 февраля 2019

Я не делаю этого на уровне формы. Я создаю один метод, которым я делюсь для всех моих входных событий KeyDown, с которыми я хочу сделать это (с одним исключением):

       private void alltextBoxes_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                SelectNextControl(ActiveControl, true, true, true, true);                    
            }
        }
        catch
        {
        }
    }

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

       private void lastinput_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }
        catch
        {
        }
    }

В противном случае элемент управления просто зацикливается внутри себя, когда вы пытаетесь запустить его в другом проекте. Вы можете использовать второй способ везде, но я думаю, что 1-й является предпочтительным способом.

0 голосов
/ 13 декабря 2016

Это решение, которое я использую для VB.NET

  1. Установите Keypreview = True в свойствах формы.

  2. Поместите этот код в событие keydown формы:

    If (e.KeyData = Keys.Enter) То

    'для любого многострочного элемента управления вы должны выйти, чтобы при многострочном нажатии клавиши textbox intro пропускалась строка.

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

    Конец, если

Наслаждайтесь !!!!

Xabier Aberasturi Larruzea

0 голосов
/ 10 февраля 2015

Я использую этот код в одном из событий keydown текстового поля

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

Невозможно обработать это keydown событие для всех текстовых полей в моей форме. Предложить что-нибудь. Спасибо

0 голосов
/ 01 сентября 2009

Для тех из вас, этот код в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...