Access子窗体组合框清空为Null后重新赋值报错问题
Access 绑定组合框必填字段赋值报错解决方案
问题背景
我有一个绑定到数据表的子窗体,其中包含组合框cboItem,其Control Source为表中的item字段。表设计中item字段设置为Required=Yes,且组合框允许手动输入值(不限制仅选列表项)。
- 进入新建记录行时,
cboItem_Enter事件自动赋值:
Private Sub cboItem_Enter() If Me.NewRecord Then cboItem = 3 End If End Sub
- 当用户删除该值(留空为Null)并按Tab切换字段时,希望弹出提示
Null entered并重新赋值为3,但当前代码报错。
当前代码与报错
Form_Error 事件代码
Private Sub Form_Error(DataErr As Integer, Response As Integer) Select Case DataErr Case 3314 'Null值输入错误 Response = acDataErrContinue Case Else Response = acDataErrDisplay End Select End Sub
cboItem_BeforeUpdate 事件代码(报错位置)
Private Sub cboItem_BeforeUpdate(Cancel As Integer) If IsNull(cboItem) Then MsgBox ("Null entered") cboItem = 3 '此行报错 Cancel = True End If End Sub
报错信息
您不能在此处输入 Null 值。请输入一个值,然后再试一次。
已尝试的无效方案
- 将代码放在
cboItem_Exit或Form_BeforeUpdate中:无提示、无报错,但未设置新值 - 将无
Cancel = True的代码放在Form_Current/Form_AfterUpdate/cboItem_LostFocus中:同样无提示、无报错,新值未生效
解决方法
问题出在BeforeUpdate事件中赋值与取消更新的顺序:在未取消更新前修改控件值,会触发字段必填的约束校验。调整逻辑,先取消更新,再设置控件值:
修正后的 cboItem_BeforeUpdate 代码
Private Sub cboItem_BeforeUpdate(Cancel As Integer) If IsNull(cboItem) Then Cancel = True '先终止当前更新流程 MsgBox "Null entered" ' 取消更新后即可安全赋值 Me.cboItem.Value = 3 ' 若需强制焦点留在组合框,可添加以下代码 ' Me.cboItem.SetFocus End If End Sub
补充说明
- 先执行
Cancel = True,让控件退出待验证状态,此时赋值不会触发字段必填约束错误 Form_Error中的3314错误处理无需修改,因为BeforeUpdate会在系统触发默认错误前拦截Null值- 若需要防止用户跳转到其他字段,可添加
Me.cboItem.SetFocus锁定焦点
内容的提问来源于stack exchange,提问作者user3173098
相关产品推荐
相关产品推荐

