Захват [tab] или [enter] при нажатии клавиши

Можно ли поймать клавишу Enter или Tab в событии KeyPress?

Я ввожу только числовое значение в поле со списком, но как только это значение будет проверено, я хочу, чтобы пользователь мог либо Tab, либо Enter из CB после проверки, возможно ли это изнутри keyPress? Вот мой код;

Private Sub cbCheckAmount_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cbCheckAmount.KeyPress
    'Only allowed characters
    Dim allowedChars As String = "0123456789."

    If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
        If e.KeyChar <> ControlChars.Back Then
            If allowedChars.IndexOf(e.KeyChar) = -1 Then
                ' Invalid Character, notify clear and return
                nonNumberEntered = True    'Set to True to 'swallow' the keypress and prevent the TextChanged event from firing.
                MsgBox("Numbers only", MsgBoxStyle.Exclamation)
                cbCheckAmount.Text = ""
                cbCheckAmount.Focus()
                cbDollarAmount.Text = ""
            End If
        End If
    End If
    'If shift key was pressed, it's not a number.
    If Control.ModifierKeys = Keys.Shift Then
        nonNumberEntered = True
        cbCheckAmount.Text = ""
        cbCheckAmount.Focus()
    End If

End Sub
Private Sub cbCheckAmount_TextChanged(sender As Object, e As EventArgs) Handles cbCheckAmount.TextChanged
    'Call the function to create a text line out of the numbers
    'Regex to ensure the string contains numbers
    Dim t As ComboBox = sender
    Dim foo As Decimal
    If Decimal.TryParse(cbCheckAmount.Text, foo) Then
        'data is good
        Dim re As New Text.RegularExpressions.Regex("\d")
        If re.IsMatch(cbCheckAmount.Text) Then
            If nonNumberEntered = False Then
                Dim newNum = cbCheckAmount.Text.Trim
                'If there are any leading weird . in the string
                newNum = newNum.TrimStart(".")
                Dim newStr As String
                'Build the array
                Dim newDec As String() = newNum.Split(New Char() {"."c})
                If newNum.Contains(".") Then
                    newStr = NumberToText(newDec(0))
                    cbDollarAmount.Text = newStr & " Dollars and " & newDec(1) & "/100 "
                Else
                    newStr = NumberToText(newDec(0))
                    cbDollarAmount.Text = newStr & " Dollars and 00/100 "
                End If

            End If
        End If
    Else
        'data is bad
        nonNumberEntered = False
        cbCheckAmount.Text = ""
        cbCheckAmount.Focus()
        cbDollarAmount.Text = ""
    End If

End Sub

Я использую VB 2015

он уже работает таким образом, вы не хотите, чтобы KeyPress срабатывал. Tab перемещает фокус, а Enter управляет кнопкой формы по умолчанию, настроенной свойством Form.AcceptButton. Используйте событие Validating элемента управления, чтобы предотвратить изменение фокуса, когда ввод недопустим.

Hans Passant 26.10.2018 03:59

Я не хочу активировать AcceptButton сейчас, у меня есть другие поля формы для ввода данных. CbCheckAmount - tabStop 3 из 4. Вот почему мне нужно разрешить пользователю использовать Tab или Enter из поля и переходить к следующему tabStop.

Mgfranz 26.10.2018 05:00
1
2
69
2

Ответы 2

Остановись и послушай. Проблема, которую вы пытаетесь решить, не существует. Просто сделайте это как следует. Обработайте событие Validating каждого элемента управления и выполните там свою проверку. Если проверка не удалась, установите e.Cancel на True, и элемент управления сохранит фокус. В обработчике событий Click вашего OK Button или чего-то еще, вызовите метод ValidateChildren, и это вызовет событие Validating для каждого элемента управления, даже если он никогда не получал фокус. Если какие-либо элементы управления не проходят проверку, ValidateChildren возвращает False, и вы знаете, что не следует пытаться использовать данные. Например.

Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
    Dim value = TextBox1.Text.Trim()

    'Data is optional but must be numeric if provided.
    If value <> String.Empty AndAlso Not Double.TryParse(value, Nothing) Then
        TextBox1.SelectAll()
        TextBox1.HideSelection = False

        MessageBox.Show("If data is provided, it must be numeric", "Invalid Data", MessageBoxButtons.OK, MessageBoxIcon.Error)

        TextBox1.HideSelection = True
        e.Cancel = True
    End If
End Sub

Private Sub TextBox2_Validating(sender As Object, e As CancelEventArgs) Handles TextBox2.Validating
    'Data is required.
    If TextBox2.Text.Trim() = String.Empty Then
        TextBox2.SelectAll()
        TextBox2.HideSelection = False

        MessageBox.Show("Data must be provided", "Invalid Data", MessageBoxButtons.OK, MessageBoxIcon.Error)

        TextBox2.HideSelection = True
        e.Cancel = True
    End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If ValidateChildren() Then
        'The data has passed validation so it is safe to use it.
    End If
End Sub

@jmcilhinhey Хорошая попытка, но нет. Если бы вы взглянули на мой код, вы могли бы увидеть, что я вызываю подпрограмму для каждого действительного TextChanged, и я хочу разрешить пользователю вводить или табуляцию из элемента управления в событии KeyPress. Я не хочу проверять на кнопке, на самом деле проверка моего кода выполнена, просто нужно, чтобы Tab и Enter переходили к следующему элементу управления.

Mgfranz 26.10.2018 14:44

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

jmcilhinney 26.10.2018 14:50

Если вы хотите увидеть весь проект, я загрузил его сюда; [ссылка] dropbox.com/s/t7mny2k3ae1fual/CheckPrint.zip?dl=0[/lin‌ k] Я использую VS2015 и застрял с правильным выводом пользователя на <Tab> или <Enter> из cbCheckAmount. Я потратил часы, пытаясь решить эту проблему, я даже попробовал события PreviewKeyDown и KeyDown. Я могу поднять MsgBox в KeyDown для Tab или Return, но он просто не оставит cbCheckAmount заполненным и SetFocus для следующего элемента управления.

Mgfranz 27.10.2018 06:40

Если я правильно понимаю, это не то, что ты хочешь просто

 If e.KeyChar = ChrW(Keys.Return) or e.KeyChar = Keys.Tab Then
        ''somethign something''
 End If

Это не сработало, выдала ошибку; Оператор '=' не определен для 'char' или 'keys' Но это близко; Если e.KeyChar = ChrW (Keys.Return) или e.KeyChar = ChrW (Keys.Tab), то MsgBox («Return or Tab нажато») End If Однако, я думаю, он захватывает только клавишу Return, а не клавишу Tab. что-то в моем KeyPress не позволяет ему выполнить «перейти к следующему TabStop»

Mgfranz 27.10.2018 03:42

Другие вопросы по теме