我有一个格式为“短日期”的文本框。当我在字段中放入无效数据时,例如随机“dfsdf”,并尝试更改焦点,表单抛出验证错误2113.我的目标是通过单击“取消”按钮给用户关闭表单没有任何问题,因为无论他在表单被取消时在Date文本框中输入了什么。
我可以处理此错误并禁用带有Form_Error事件的消息,但无论如何,焦点保持设置为日期textBox,当我尝试单击取消按钮,并且永远不会点击按钮。
我使用的设置可能类似于你的设置:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Const InvalidDate As Long = 2113
Select Case DataErr
Case InvalidDate
MsgBox "Invalid date!"
Response = acDataErrContinue
' Cancel invalid entry.
Me.Undo
' DoCmd.Close
Case Else
Response = acDataErrDisplay
End Select
End Sub
问题是,这会在您的按钮获得焦点之前触发。这意味着,表单甚至不知道您点击了什么,只是它在日期文本框之外的某个地方。
因此,DoCmd.Close
将关闭所点击的任何形式。
你可以把它变成一个优势,用户可以看到删除错误输入...
您应该使用更新后事件检查用户是否输入了有效日期,如果没有,则清除或撤消。在不知道表单控件的情况下,我无法判断您是否允许用户更改表值或者您是否正在使用事务。 伪代码:
Private Sub Text1_AfterUpdate()
If Check_If_Date Then
Execute_Code
Else
End If
End Sub
Private Function Check_If_Date() as Boolean
If IsDate(Text1) then
Check_If_Date = True
Else
Check_If_Date = False
Select Case msgbox("Not a valid date", vbOKCancel)
case vbOK
reset_value
case vbCancel
Close_Form
case else
End Select
End If
End Sub
Private Sub Reset_Value()
'need to clear value or undo
End Sub
Public Sub Execute_Code()
'Code to save values or allow Update to complete
End Sub
Private Sub Close_Form()
'Code For Closing Form and logging errors
End Sub
如果可以在另一个文本框中重复相同的事情(例如第二个日期)或者为其他控件获取相同的行为,我会将可重复的操作拆分为重用。