You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何子表单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:03:15