我有一个文本框,格式为“短日期”。当我在字段中放入无效数据(例如随机的“ dfsdf”)并尝试更改焦点时,表单将抛出验证错误2113。 我的目标是给用户一个机会,通过单击“取消”按钮完全没有问题,因为无论用户在取消表单时在“日期”文本框中输入什么内容。
我可以处理此错误并通过Form_Error事件禁用消息,但是当我尝试单击“取消”按钮时,焦点仍然设置为日期文本框,而按钮从未被单击。
答案 0 :(得分:0)
我使用的设置可能与您相似:
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
将关闭所有单击的表单。
您可以将它变成一个优势,那就是用户可以观察到错误输入的移除...
答案 1 :(得分:0)
您应使用更新后事件检查用户是否输入了有效日期,
如果没有,请清除或撤消。在不知道表单控件的情况下,我无法告诉您是否允许用户更改表值或是否正在使用事务。
伪代码:
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
如果可以在另一个文本框中重复执行相同的操作(例如第二次约会)或使其他控件获得相同的行为,我将重复的操作拆分开以便重复使用。