Access文件重开后子窗体无法识别主窗体日期文本框数据源问题
异常成因
- Access窗体加载时,子窗体的数据源绑定优先级高于主窗体控件的初始化流程。你打开文件时,绑定了查询的子窗体先执行查询逻辑,此时主窗体的
txt_from、txt_to两个文本框还没完成默认值赋值和属性注册,查询找不到对应控件值,就会触发参数输入弹窗。 - 修改文本框名称后临时生效的原因是:该操作会触发Access的窗体对象缓存刷新,当前会话下Access会重新识别控件引用,但文件重启后缓存重置,问题会复现。
解决方案
方案1:调整加载逻辑,动态绑定子窗体数据源(最推荐)
- 删掉原有查询里写死的窗体控件引用条件,保留为不带日期过滤的基础查询。
- 在主窗体的
Load事件中添加如下代码,等主窗体所有控件初始化完成后,再为子窗体绑定带过滤条件的数据源:
Private Sub Form_Load() Dim strSQL As String ' 以下中文占位符需替换为你数据库内对应的实际名称 strSQL = "SELECT * FROM 你的基础查询名称 " & _ "WHERE 你的日期字段名 Between #" & Format(Me.txt_from, "yyyy-mm-dd") & "# And #" & Format(Me.txt_to, "yyyy-mm-dd") & "#" Me.你的子窗体控件名称.Form.RecordSource = strSQL End Sub
- 可额外给两个日期文本框添加
AfterUpdate事件,修改日期后自动刷新子窗体数据:
Private Sub txt_from_AfterUpdate() Call Form_Load End Sub Private Sub txt_to_AfterUpdate() Call Form_Load End Sub
方案2:封装控件引用为公共函数
- 新建一个公共模块,添加如下两个全局函数:
Public Function GetFromDate() As Date GetFromDate = Forms!frm_mainform!txt_from End Function Public Function GetToDate() As Date GetToDate = Forms!frm_mainform!txt_to End Function
- 将原有查询的过滤条件修改为
Between GetFromDate() And GetToDate()即可。Access执行查询时会主动调用函数获取值,不会受窗体加载时序影响。
方案3:延迟加载子窗体(应急临时方案)
把子窗体的Visible属性默认设为False,在主窗体Load事件的最后一行添加代码Me.你的子窗体控件名称.Visible = True,让子窗体延迟到主窗体初始化完成后再加载绑定数据。
内容的提问来源于stack exchange,提问作者Dule Marin
相关产品推荐
相关产品推荐

