在VB.Net中使用Enter键实现Tab键功能

hwazgwia  于 2023-04-07  发布在  .NET
关注(0)|答案(8)|浏览(286)

我有一个窗体与近20文本框和5组合框和一个控件在依赖于其他,现在我想写的形式在这样一种方式的代码,按Enter键和Tab键应该有相同的功能.
与按Tab键一样,当我按Enter键时,焦点移动到下一个控件也应该执行。同样,当我按Enter键时,在按键事件中写入了一些过程代码,但当我按Tab键时,也应该执行此操作。

k3bvogb1

k3bvogb11#

首先使窗体的Keypreview属性为True,然后将下面的代码粘贴到窗体的Keydown事件中

If e.KeyCode = Keys.Enter Then
    Me.SelectNextControl(Me.ActiveControl, True, True, True, False) 'for Select Next Control
End If
dffbzjpn

dffbzjpn2#

我在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 question

hi3rlvi2

hi3rlvi23#

简单地制作以下功能

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

在控件的keydown事件上调用此函数

q8l4jmvw

q8l4jmvw4#

我能够做到这一点,而不必手动创建或设置每个控件的事件处理程序。在窗体的初始化,我运行一个函数,循环通过每个控件,并添加一个通用的处理程序函数。

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
vd8tlhqk

vd8tlhqk5#

对于同样的问题,我使用的一个更好的选择是创建一个新的文本框类textboxClass,并将下面的代码粘贴到它的keypress事件中

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,仅用于此页面的单个文本框。

sqyvllje

sqyvllje6#

可以在窗体的Load事件中将窗体的KeyPreview属性设置为True,并处理窗体的KeyDown事件。然后,可以检查活动控件是否为文本框,并且按下的键是否为Enter键,如果是,则可以将事件的Handled属性设置为True,并使用SelectNextControl方法将焦点移动到Tab键顺序中的下一个控件(示例使用Form1)。

Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.KeyPreview = True
End Sub

然后添加以下代码:

Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles myBase.KeyDown
        If TypeOf Me.ActiveControl Is TextBox AndAlso e.KeyCode = Keys.Enter Then
            e.Handled = True
            Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
        End If
    End Sub

当焦点位于表单中的文本框时,这将允许Enter键充当Tab键。

wwtsj6pe

wwtsj6pe7#

这是相当古老的,但我得到了这里,因为我想做同样的事情。这里的一些答案的问题是,他们总是会跳转到下一个控件时,按回车键,我只希望它做的文本框。如果他们得到一个按钮,我希望他们能够按回车键“点击”该按钮。所以这里是我做了什么。

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

在sub的handles部分添加所有的.keypress是一种痛苦,但然后你可以控制哪些项目会导致它移动到下一个控件,哪些不会。当然,你还必须在设计时设置制表符停止顺序。但使用这种方法,它仍然可以触发按钮按下,一旦它跳到一个按钮,他们再次点击回车。
我本来想把这个作为评论加进去的,但是我没有足够的分数来加评论。:)

tcbh2hod

tcbh2hod8#

你可以用JavaScript来实现:Enter Key Focus

相关问题