这是我认为应该在 Microsoft Office Access 中工作的东西(并且我相信我曾经让它工作过)。
我有一个记录表单,其中包含一些绑定控件和一个用于保存表单上的值的按钮。
按钮的 OnClick 处理程序基本上是一个
private sub btnSave_Click()
me.dirty = false
end sub
由于我需要检查输入的值,因此还有一个 OnBeforeUpdate 处理程序:
private sub form_beforeupdate(cancel as integer)
if nz(me.SomeControl, "") = "" then
msgBox("....")
cancel = true
exit sub
end if
' ... more checks ...
end sub
现在,当我单击按钮并且处理程序到达 me.dirty=false 时,执行流程将转到 BeforeUpdate 处理程序,这是预期的。由于ComeControl没有填充,所以cancel被设置为true,并且sub退出,这仍然是预期的。
问题是当执行流程返回到按钮 Click 处理程序时。
me.dirty = false
行停止执行,并抛出 运行时错误“2101”您输入的设置对此属性无效。
这不是预期的,我确实相信我已经成功了。
无论如何,我该如何将这样的保存按钮与 BeforeUpdate 处理程序一起使用?
我认为你设计界面的方式是错误的。在填写完所有数据之前,我不会让用户单击“保存”按钮。
因此,在填写所有必填字段之前,“保存”按钮将被禁用。为了实现此目的,您需要在控件的 AfterUpdate 事件中测试每个所需控件的值。一般来说,你需要测试这组值,所以我倾向于编写一个函数来测试所有必需的值,如果所有值都填写则返回 TRUE,然后在所有必需控件的 AfterUpdate 事件中使用它:
Private Sub txtLastName_AfterUpdate()
Me!btnSave.Enabled = CheckRequiredFields()
End Sub
现在,为了使这对您来说更容易,您可以更改 CheckRequiredFields,使其不仅仅是一个函数,而是设置“保存”按钮的“Enabled”属性,然后您只需将“=CheckRequiredFields”粘贴到所有字段的 AfterUpdate 属性中即可控件(这假设您不需要在 AfterUpdate 事件中执行任何其他操作)。
我一直对对话框表单执行此操作,默认情况下禁用“确定”按钮,仅启用“取消”按钮。然后,我测试是否已使用上述方法填写了所有字段。因此,在正确输入所有内容之前,用户无法执行该操作。在我看来,这比捕获“保存”按钮中丢失的数据更好——也就是说,在记录完成之前不要让用户尝试保存。
鉴于 Access 默认保存记录,您此时是否需要保存记录?如果是这样,也许捕获错误会适合:
Private Sub btnSave_Click()
On Error GoTo Err_Handler
Me.Dirty = False
Exit_Here:
Exit Sub
Err_Handler:
If Err.Number=2101 Then
'ignore or message
Else
MsgBox Err.Description
End If
Resume Exit_Here
End Sub
将
cancel = true
替换为 me.undo
private sub form_beforeupdate(cancel as integer)
if nz(me.SomeControl, "") = "" then
msgBox("....")
' cancel = true
me.undo
exit sub
end if
' ... more checks ...
end sub