在表单和面板中使用ENTER或RETURN作为TAB

时间:2017-12-06 17:31:24

标签: vb.net winforms

我的表单作为多个控件,例如TextboxesPanels以及Textboxes中的Panels,这会导致问题。我尝试将密钥ENTERRETURNTAB做同样的操作,因此请选择下一个控件,但由于未知原因,如果我从任何控件转到面板,它不会&# 39; t进入面板中的第一个控件,它会跳到下一个不是面板的控件。

我的表单key preview已经True,我的标签索引也可以: 第一个文本框是10,第一个面板11,面板12的第一个文本框。现在它跳到20,下一个文本框不在面板中。

基于此问题的代码:Tab Key Functionality Using Enter Key in VB.Net

这是我的代码

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

谢谢!

3 个答案:

答案 0 :(得分:2)

我真的不了解代码片段,它看起来像是放弃之前的最后一次尝试。它根本不是如何运行的,KeyPreview不足以拦截KeyDown的导航键,如Enter键。 SelectNextControl()的嵌套参数当然不应该是False,你确实要考虑嵌套在面板中作为下一个标签目标的控件,大概是使代码跳出轨道的原因。 / p>

我将发布一个更通用的解决方案,它不依赖于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

答案 1 :(得分:1)

在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

您仍需要将表单上的Key Preview参数设置为True

我还在这里找到了另一种选择:How to make Enter on a TextBox act as TAB button

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

答案 2 :(得分:0)

使用processTabKey(true)函数