按Enter键与单击Windows窗体的AcceptButton不同

时间:2015-05-27 20:03:53

标签: vb.net validation

我有一个简单的VB.Net Windows窗体应用程序,它有两个TextBox和一个Button,它是表单的AcceptButton。唯一的代码是在ButtonClick上,并使用Leave事件验证每个TextBox。 (我也尝试了LostFocus事件,它似乎也一样)。我的问题是,如果我用鼠标单击按钮,那么用户所在的TextBox会发生正确的Leave(或LostFocus)事件,但如果按Enter键,焦点不会丢失,因此该TextBox的代码会不跑。

如何使Enter键的行为与点击表格的AcceptButton相同?

4 个答案:

答案 0 :(得分:0)

当您单击Enter键时,您正在从文本框失去焦点到按钮?! 如果是这样,你可以试试这个:

   Protected Overrides Function ProcessCmdKey(ByRef sMessage As Message, ByVal oKeyData As Keys) As Boolean
    If oKeyData = Keys.Enter Then
        Me.Textbox1.Focus()
        AcceptButton.PerformClick()
        Return True
    ElseIf oKeyData = Keys.Escape Then
        Application.Exit()
        Return True
    Else
        Return MyBase.ProcessCmdKey(sMessage, oKeyData)
    End If
   End Function
  

我希望这能帮到你;)

答案 1 :(得分:0)

我同意Plutonix - 为什么不在click事件中对两个文本框进行验证? (除非这是出于教育目的?)

如果你真的想在文本框中验证'离开事件,您需要在当前文本框中进行验证,才能在按Enter键之前按钮执行,然后您需要按键事件才能处理两个文本框的按键操作。在那里,检查按下的键是否输入,如果是,那么你可以得到有焦点的文本框...称之为“离开”事件,然后调用按钮的点击事件。 / p>

这有意义吗?

答案 2 :(得分:0)

当您直接点击该按钮时,会有一系列事件,包括TextBox.LostFocusTextBox.LeaveButton.MouseEnterButton.Click

但是当你按Enter键时,它就是拦截按键的表格,如果它是Enter并且有一个AcceptButton,那么启动它的PerformClick方法而不会引发大部分事件。

您可以轻松验证;通过设计器将Button的DialogResult设置为一个值,并在将DialogResult更改为另一个值时处理Button的GotFocus事件。 然后测试你的代码(存储Form.ShowDialog的结果);直接点击你将获得在GotFocus上设置的值,因为它是在Click the form设置它的DialogResult按钮的DialogResult值;按下输入你将得到最初的Dialogresult(设计师一个)有效地证明没有输入GotFocus。

回到当前的问题;为了解决这个问题,您需要在Validating(或Validated)事件中处理您的验证;确保您的文本框CauseValidation设置为true [默认值],否则不会引发这些事件。你可以在它们里面设置e.Cancel(使用EN的CancelEventArgs参数)为true来停止验证(和事件链)有效地将焦点放在“无效”控件内(这也会阻止按钮点击任何使用的方式到达它)

一个例子:这个表单有两个Textboxes和一个Button作为Form的AcceptButton并“验证”它的输入,因此不允许空TextBox.Text

Public Class NonEmptyTextBoxesForm
    Private Sub TextBoxes_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating, TextBox2.Validating
        Dim tb = DirectCast(sender, TextBox)
        e.Cancel = tb.Text = "" ' e.Cancel = (tb.Text = "") ' if that's make this clearer
    End Sub
End Class

答案 3 :(得分:0)

如何使Enter键的行为与单击表单的AcceptButton相同?

要使ENTER键的行为与单击“接受”按钮相同,您可以使用表单的ACCEPTBUTTON属性,并在按下ENTER键时指定要单击的按钮。

虽然这会导致按钮的click事件中的代码被执行, 我不知道TEXTBOX-LOSTFOCUS事件中的代码是否会执行!

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  '
  ' Assign default button for ENTER key (Okay Button)
  Me.AcceptButton = Me.MyOkayButton
  '
  ' Assign default button for ESCAPE key (Cancel Button)
  Me.CancelButton = Me.MyCancelButton
  '
End Sub