在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,因此取消设置为true并退出子,这仍然是预期的。
问题是当执行流程返回按钮Click handler时。第me.dirty = false
行停止执行,运行时错误'2101'您输入的设置对此属性无效。
这不是预期的,我确实相信我有这个工作。
无论如何,我如何与BeforeUpdate处理程序一起使用这样的保存按钮?
答案 0 :(得分:2)
你以我认为错误的方式设计了你的界面。在完成所有数据填写之前,我不允许用户单击“保存”按钮。
因此,SAVE按钮被禁用,直到填写所有必填字段。为了实现这一点,您需要在控件的AfterUpdate事件中测试每个所需控件的值。通常,您需要测试值组,因此我倾向于编写一个测试所有必需值的函数,如果所有值都填写则返回TRUE,然后在所有必需控件的AfterUpdate事件中使用它:
Private Sub txtLastName_AfterUpdate()
Me!btnSave.Enabled = CheckRequiredFields()
End Sub
现在,为了让自己更容易,你可以更改CheckRequiredFields,使它不仅仅是一个函数,而是设置Save按钮的Enabled属性,然后你只需将“= CheckRequiredFields”粘贴到AfterUpdate属性中即可。所有控件(假设您不需要在AfterUpdate事件中执行任何其他操作)。
我一直在为对话框表单执行此操作,默认情况下禁用“确定”按钮并仅启用“取消”按钮。然后我测试使用上面的方法填写了所有字段。因此,在正确输入所有内容之前,用户无法执行操作。在我看来,这比在SAVE按钮中捕获丢失的数据更可取 - 也就是说,在记录完成之前,不要让用户尝试保存。
答案 1 :(得分:1)
此时您是否需要保存记录,因为保存是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