MS Access 2010中能否调整子窗体Open事件顺序,使父窗体先触发?
在MS Access 2010中让父窗体Form_Open事件先于子窗体触发的方法
我正在使用MS Access 2010,根据微软官方文档(适用于2010、2007等版本)的说明,子窗体及其控件的事件(如Open、Current、Enter和GotFocus)应先于父窗体的事件触发。但实际遇到的事件顺序如下:
Parent: Form_Open-START Child: Form_Open-START (when setting RecordSource in Form_Open of parent) Child: Form_Open-End Parent: Form_Open-END
而我预期的顺序应为:
Child: Form_Open-START Child: Form_Open-End Parent: Form_Open-START Parent: Form_Open-END
请问是否有办法让父窗体的Form_Open事件先于子窗体触发?
解决方案
方案1:延迟设置子窗体的RecordSource
你当前的子窗体Open事件提前触发,是因为在父窗体Form_Open中设置了子窗体的RecordSource,这会强制子窗体立即加载并触发Open事件。要让父窗体Form_Open先执行完成,可将设置子窗体RecordSource的操作移到父窗体的Form_Load事件中。
Form_Load事件会在父窗体和子窗体的Open事件都完成后触发,调整后的事件顺序会变成:
Parent: Form_Open-START Parent: Form_Open-END Child: Form_Open-START Child: Form_Open-END Parent: Form_Load-START Parent: 设置子窗体RecordSource Parent: Form_Load-END
此方法能实现父窗体Form_Open先于子窗体触发,适合优先执行父窗体初始化逻辑的场景。
方案2:先预加载子窗体再打开父窗体
如果需要严格按照你预期的顺序(子窗体Open完全完成后再触发父窗体Open),可以先单独加载子窗体(隐藏状态),待其Open事件执行完毕后再打开父窗体:
- 在打开父窗体前,先执行代码打开并隐藏子窗体:
DoCmd.OpenForm "你的子窗体名称", acNormal, , , , acHidden - 此时子窗体的Form_Open事件会先执行完成,随后再触发父窗体的Form_Open事件。
- 在父窗体的Form_Load事件中,将子窗体控件关联到已加载的子窗体:
Me.子窗体控件名称.SourceObject = "你的子窗体名称" - 最后可根据需求显示子窗体。
注意事项
- 使用方案2时,需避免子窗体重复加载,可添加判断逻辑确保每次仅加载一次。
- 调整事件顺序后,需测试原有业务逻辑是否受影响,确保功能正常运行。
内容的提问来源于stack exchange,提问作者Oriel Tzvi Shaer
相关产品推荐
相关产品推荐

