Vb.net 在窗体和面板中使用ENTER或RETURN as选项卡

Vb.net 在窗体和面板中使用ENTER或RETURN as选项卡,vb.net,winforms,Vb.net,Winforms,我的表单是多个控件,如文本框和面板,以及面板中的文本框,这会导致问题。我尝试使键ENTER和RETURN执行与TAB相同的操作,因此选择下一个控件,但由于未知原因,如果我从任何控件转到面板,它不会进入面板中的第一个控件,而是跳到下一个不是面板的控件 我的表单键预览已经为真并且我的选项卡索引正常: 第一个文本框是10,第一个面板11,面板12的第一个文本框。现在它跳到20,下一个文本框不在面板中 基于此问题的代码: 这是我的密码 Private Sub Values_KeyDown(ByVal s

我的表单是多个控件,如
文本框
面板
,以及
面板
中的
文本框
,这会导致问题。我尝试使键
ENTER
RETURN
执行与
TAB
相同的操作,因此选择下一个控件,但由于未知原因,如果我从任何控件转到面板,它不会进入面板中的第一个控件,而是跳到下一个不是面板的控件

我的表单
键预览
已经
为真
并且我的选项卡索引正常: 第一个文本框是10,第一个面板11,面板12的第一个文本框。现在它跳到20,下一个文本框不在面板中

基于此问题的代码:

这是我的密码

Private Sub Values_KeyDown(ByVal sender As Control, 
  ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Return Or e.KeyCode = Keys.Enter Then
        If TypeOf Me.GetNextControl(Me.ActiveControl, True) Is Panel Then
            Me.SelectNextControl(CType(Me.ActiveControl, Panel).Controls.Item(0), True, True, False, True)
        Else
            Me.SelectNextControl(Me.ActiveControl, True, True, False, True)
        End If
        e.Handled = True
    End If
End Sub

谢谢

我不太理解代码片段,它看起来像是放弃之前的最后一次尝试。也不知道它是如何运行的,KeyPreview不足以拦截像Enter键这样的导航键的KeyDown。StestNutExcManel()的嵌套参数不一定是false,您确实需要考虑嵌套在面板中的控件作为下一个选项卡目标,大概是什么使代码从轨道上跳过。 我将发布一个更通用的解决方案,它不依赖于KeyPreview,并且仍然正确地处理需要Enter键才能正常工作的控件。只需将其复制/粘贴到表单中,它不使用事件:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
    Dim dotab = False
    Dim ctl = Me.ActiveControl
    If ctl IsNot Nothing And keyData = Keys.Enter Then
        dotab = True
        If TypeOf ctl Is TextBoxBase Then
            If DirectCast(ctl, TextBoxBase).Multiline Then dotab = False
        End If
    End If
    If dotab Then
        If Me.SelectNextControl(ctl, True, True, True, True) Then Return True
    End If
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

在Hans的回答中,我通过简单地将嵌套参数更改为true,并去掉了本应使其与面板一起工作的部分,使其工作,如下所示:

Private Sub Values_KeyDown(ByVal sender As Control, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Return Or e.KeyCode = Keys.Enter Then
        Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
        e.Handled = True
    End If
End Sub
您仍然需要将表单上的键预览参数设置为True

我还发现了另一种选择:


使用processTabKey(true)函数

很好,只需将嵌套参数更改为true即可。我会发布我的答案,但我不需要覆盖任何东西来让它工作。据我所知,将KeyPreview设置为表单的真值可以让我捕获表单上任何内容的每个键和按键事件,甚至控件。那么,这怎么会导致我在捕捉按键事件时出现问题呢?好吧,尽管有这段代码,但您有两个解决方案,一个是“不喜欢”。迟早你会使用Rich/TextBox,你会知道该怎么做。
Private Sub Values_KeyDown(ByVal sender As Control, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Return Or e.KeyCode = Keys.Enter Then
        SendKeys.Send("{TAB}")
        e.Handled = True
    End If
End Sub