Функциональность клавиши Tab с помощью клавиши Enter в VB.Net - PullRequest
4 голосов
/ 07 декабря 2011

У меня есть форма с почти 20 Textbox и 5 Combobox и один элемент управления в зависимости от другого, Теперь я хочу написать код для формы таким образом, что, нажав Enter Key и *Клавиша 1003 * Tab должна иметь ту же функциональность.

Как и при нажатии Tab Клавиша, при которой фокус перемещается на следующий элемент управления, также должна выполняться при нажатии Enter Ключ.Аналогично, когда я нажимаю клавишу Enter , в событии нажатия клавиши записывается некоторый код процесса, но это также следует выполнять при нажатии клавиши Tab .

Ответы [ 7 ]

8 голосов
/ 09 января 2015

Сначала сделайте свойство Keypreview вашей формы = True И затем вставьте код ниже в форме Keydown Event

 If e.KeyCode = Keys.Enter Then
    Me.SelectNextControl(Me.ActiveControl, True, True, True, False) 'for Select Next Control
End If
7 голосов
/ 07 декабря 2011

Я выполнил это в Winforms, используя метод SelectNextControl.

т.е.

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    Dim tb As TextBox
    tb = CType(sender, TextBox)

    If Char.IsControl(e.KeyChar) Then
        If e.KeyChar.Equals(Chr(Keys.Return)) Then
            Me.SelectNextControl(tb, True, True, False, True)
            e.Handled = True
        End If
    End If
End Sub

Если вы используете WPF, вы можетеиспользуйте TraversalRequest

т.е.

Private Sub TextBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs)
    Dim tb As TextBox
    tb = CType(sender, TextBox)

    If e.Key = Key.Return Then
        tb.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
    ElseIf e.Key = Key.Tab Then
        Exit Sub
    End If
End Sub

Что касается перехвата клавиши Tab , взгляните на этот Stackoverflow вопрос .

1 голос
/ 08 декабря 2017

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

Private Sub AddHandlers()
    Try
        'Get the first control in the tab order.
        Dim ctl As Windows.Forms.Control = Me.GetNextControl(Me, True)
        Do Until ctl Is Nothing
            If TypeOf ctl Is System.Windows.Forms.TextBox Or TypeOf ctl Is System.Windows.Forms.ComboBox _
                    Or TypeOf ctl Is System.Windows.Forms.CheckBox Or TypeOf ctl Is System.Windows.Forms.DateTimePicker Then

                AddHandler ctl.KeyDown, AddressOf ReturnKeyTabs
            End If
            'Get the next control in the tab order.
            ctl = Me.GetNextControl(ctl, True)
        Loop
    Catch ex As Exception
    End Try
End Sub

Private Sub ReturnKeyTabs(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.KeyCode = System.Windows.Forms.Keys.Return Then
        e.Handled = True
        e.SuppressKeyPress = True
    End If
    ReturnKeyTabs(e.KeyCode)
End Sub

Private Sub ReturnKeyTabs(ByVal KeyCode As System.Windows.Forms.Keys)
    If KeyCode = System.Windows.Forms.Keys.Return Then
        System.Windows.Forms.SendKeys.Send("{Tab}")
        KeyCode = 0
    End If
End Sub
1 голос
/ 04 февраля 2014

просто выполните следующую функцию

Public Sub perform_tab_on_enter(ByVal e As KeyEventArgs) 
If e.KeyCode = Keys.Enter Then 
  SendKeys.Send("{TAB}")
else
  exit sub
End If
e.SuppressKeyPress = True 'this will prevent ding sound 
End Sub

вызовите эту функцию при событии нажатия клавиши

0 голосов
/ 13 октября 2018

Это довольно старый, но я попал сюда, потому что хотел сделать то же самое.Проблема с некоторыми из ответов здесь заключается в том, что они всегда будут переходить к следующему элементу управления при нажатии клавиши ввода, и я хочу, чтобы это делалось только с текстовыми полями.Если они дойдут до кнопки, я хочу, чтобы они могли нажать Enter, чтобы «нажать» на эту кнопку.Итак, вот что я сделал.

Private Sub txtName_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtName.KeyPress, txtAttn.KeyPress, txtAdd1.KeyPress, txtAdd2.KeyPress, txtCity.KeyPress, txtState.KeyPress, txtZip.KeyPress

    If Asc(e.KeyChar) = 13 Then
        e.Handled = True
        SendKeys.SendWait("{TAB}")
    End If

End Sub

Это боль от необходимости добавлять все .keypress в ручку части сабвуфера, но тогда вы можете контролировать, какие элементы заставят его перемещаться вследующий контроль и который не будет.Конечно, вы также должны установить порядок табуляции во время разработки, чтобы это работало.Но с помощью этого метода, он все еще может вызвать нажатие кнопки, как только он нажимает на кнопку, и они нажимают ввод снова.

Я бы просто добавил это как комментарий, но у меня недостаточно очков для добавления комментариев.:)

0 голосов
/ 02 июля 2015

Лучший вариант, который я использую для той же проблемы, - это создать новый класс textboxClass и вставить следующий код в событие нажатия клавиши

    Private Sub commonTextbox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
            If Char.IsControl(e.KeyChar) Then
                If e.KeyChar.Equals(Chr(Keys.Return)) Then
                    Me.Parent.SelectNextControl(Me, True, True, False, True)
                    e.Handled = True
                End If
            End If
    End Sub

Теперь мы можем добавить любое количество текстовых полей в любую форму.это будет вести себя как хотелось бы.при нажатии клавиши ввода в последнем текстовом поле фокус переходит к первому.

Этот код взят из @Mark Hall только для одного текстового поля только на этой странице.

0 голосов
/ 07 декабря 2011

Вы можете сделать это с помощью некоторого JavaScript: Введите ключевой фокус

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...