为何子表单sfrm2无数据时Form_Current事件不触发?
解决Access子表单空记录时Requery不触发Form_Current的问题
问题根源
当sfrm2的记录集为空、且RecordsetType设为Snapshot同时未启用新记录行时,执行Requery后没有可切换的“当前记录”,因此不会触发Form_Current事件,导致记录源无法更新。
可行修改方案
方案1:直接在sfrm1中更新sfrm2的记录源(推荐)
放弃依赖sfrm2的Form_Current事件,直接在sfrm1的Form_Current中完成记录源更新+刷新操作,确保无论有无数据都能生效:
Private Sub Form_Current() Dim sfrmTarget As Form ' 获取子表单对象 Set sfrmTarget = Me.Parent.Controls("ctlsfrmShowLos").Form ' 直接更新子表单的记录源 sfrmTarget.RecordSource = "SELECT * " & _ " FROM [dbo_Los] " & _ " WHERE [losklkID] = " & gMyClsTempVars_frmChartKalkulation.prpTempVar(gclngTV_FrmChartKalkulation_KalkID) & _ " ORDER BY 1" ' 执行刷新 sfrmTarget.Requery Set sfrmTarget = Nothing End Sub
同时删除sfrm2中Form_Current事件里的记录源更新代码,避免重复操作。
方案2:调整sfrm2的记录集类型或启用新记录行
如果坚持要在sfrm2的Form_Current中处理:
- 将sfrm2的RecordsetType改为
Dynaset(即使是展示用也可兼容) - 或启用sfrm2的允许添加属性(可通过设置
DataEntry=False+AllowAdditions=True,让用户看不到新记录行但底层有空白记录)
这样空记录时Requery会触发Form_Current事件,但要确保Form_Current中的代码能处理空记录场景(比如不会因引用空记录字段报错)。
方案3:手动触发sfrm2的Form_Current事件
在sfrm1的Requery后直接调用sfrm2的Form_Current方法,强制执行更新逻辑:
Private Sub Form_Current() Dim sfrmTarget As Form Set sfrmTarget = Me.Parent.Controls("ctlsfrmShowLos").Form sfrmTarget.Requery ' 手动触发Form_Current事件 Call sfrmTarget.Form_Current Set sfrmTarget = Nothing End Sub
注意:此方法需确保sfrm2的Form_Current代码能兼容空记录情况,避免报错。
内容的提问来源于stack exchange,提问作者candidesh
相关产品推荐
相关产品推荐

