我的表单作为多个控件,例如Textboxes
和Panels
以及Textboxes
中的Panels
,这会导致问题。我尝试将密钥ENTER
和RETURN
与TAB
做同样的操作,因此请选择下一个控件,但由于未知原因,如果我从任何控件转到面板,它不会&# 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
谢谢!
答案 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)函数