Detecting Enter keypress on VB.NET
我正在使用VB.NET 2008的.NET 3.5框架。
我的表单中有一些文本框。 当用户在我的一个文本框上按ENTER键时,我希望出现类似选项卡的行为。 我使用以下代码:
1 2 3 4 5 6 | Private Sub txtDiscount_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtDiscount.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then SendKeys.Send("{TAB}") e.Handled = True End If End Sub |
但这对我不起作用。
解决办法是什么?
在KeyDown事件中:
1 2 3 | If e.KeyCode = Keys.Enter Then Messagebox.Show("Enter key pressed") end if |
确保窗体的KeyPreview属性设置为true。
1 2 3 4 5 6 7 | Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then SendKeys.Send("{TAB}") e.Handled = True End If End Sub |
无需将KeyPreview属性设置为True。只需添加以下功能。
1 2 3 4 5 6 7 8 9 10 | Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, _ ByVal keyData As System.Windows.Forms.Keys) _ As Boolean If msg.WParam.ToInt32() = CInt(Keys.Enter) Then SendKeys.Send("{Tab}") Return True End If Return MyBase.ProcessCmdKey(msg, keyData) End Function |
现在,当您在文本框上按Enter时,该控件将移至下一个控件。
我正在使用VB 2010 .NET 4.0并使用以下内容:
1 2 3 4 5 6 7 8 9 | Private Sub tbSecurity_KeyPress(sender As System.Object, e As System.EventArgs) Handles tbSecurity.KeyPress Dim tmp As System.Windows.Forms.KeyPressEventArgs = e If tmp.KeyChar = ChrW(Keys.Enter) Then MessageBox.Show("Enter key") Else MessageBox.Show(tmp.KeyChar) End If End Sub |
奇迹般有效!
您可以使用PreviewKeyDown事件
1 2 3 4 5 | Private Sub txtPassword_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtPassword.PreviewKeyDown If e.KeyCode = Keys.Enter Then Call btnLogin_Click(sender, e) End If End Sub |
在VB.NET 2010上测试
我看到已经解决了这个问题,但是您似乎可以通过将验证挂接到表单上的AcceptButton上来避免回车键的所有这种"重新映射"。即。您有3个文本框(txtA,txtB,txtC)和一个"确定"按钮设置为AcceptButton(并且TabOrder设置正确)。因此,如果在txtA中并且按回车键,则数据无效,则焦点将停留在txtA中,但如果有效,则假设其他txt需要输入,验证只会将您放入需要有效输入的下一个txt中,因此模拟TAB行为...一旦所有txt均具有有效输入,按Enter将触发成功的验证并关闭表格(或其他方式)是否有意义?
也可以尝试这样:
1 2 3 |
使用KeyDown事件代替KeyPress
1 2 3 |
注意:请确保您没有在表单上设置"接受按钮"。 AcceptButton将其设置为"无"
1 2 3 4 |
使用此代码,它将可以正常工作。
您应单击TextBox1,然后转到event并选择Keyup并双击它。然后您将获得SUB的行。
1 2 3 4 5 6 7 | Private Sub TextBox1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp If e.KeyCode = Keys.Enter Then MsgBox("Fel l?senord") End If End Sub |
以下代码将起作用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Public Class Form1 Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = Convert.ToChar(13) Then MsgBox("enter key pressd") End If End Sub End Clas Public Class Form1 Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.KeyCode = Keys.Enter Then MsgBox("enter key pressd") End If End Sub End Class |
使用此代码,这可能有助于您在用户按下Enter键时获得类似于选项卡的行为
1 2 3 4 5 6 7 8 9 | Private Sub TxtSearch_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TxtSearch.KeyPress Try If e.KeyChar = Convert.ToChar(13) Then nexttextbox.setfoucus End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub |
1 2 3 4 5 6 7 8 9 10 |
我遇到了同样的问题,我无法在Framework 2.0上使用此答案,因此我进行了更深入的研究。
您必须首先处理文本框上的PreviewKeyDown,以便在输入ENTER时设置IsInputKey,以便可以由文本框上的keyDown事件处理或将其转发给该事件。像这样:
1 2 3 4 5 6 | Private Sub txtFiltro_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtFiltro.PreviewKeyDown Select Case e.KeyCode Case Keys.Enter e.IsInputKey = True End Select End Sub |
然后您将在文本框上处理事件keydown。答案之一是在正确的轨道上,但是没有设置e.IsInputKey。
1 2 3 4 5 6 | Private Sub txtFiltro_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtFiltro.KeyDown If e.KeyCode = Keys.Enter Then e.handled = True Textbox1.Focus() End If End Sub |