Access子窗体执行Requery后无法为主窗体控件设置焦点
问题根因
子窗体执行Requery操作后,界面焦点会默认转移到子窗体的记录区域,此时直接对主窗体控件执行SetFocus时,Access还未完成子窗体Requery后的界面消息处理,导致焦点设置操作被覆盖失效。同时你代码中存在逻辑错误也可能影响执行流程。
修复方案
1. 先修正代码逻辑错误
你Cleanup段的空值判断写法存在语法错误,错误的表达式计算可能干扰后续代码执行,将原代码:
If IsNull(Me.LotNum Or Me.LotNum = "") Then
修改为正确的判断逻辑:
If IsNull(Me.LotNum) Or Me.LotNum = "" Then
2. 增加界面消息处理语句
在设置焦点前加DoEvents让Access先完成所有待处理的界面更新操作,再执行焦点设置,修改对应代码段:
Me!UPCScan = Null DoEvents ' 优先处理完子窗体Requery后的所有界面操作 Me.UPCScan.SetFocus
3. 二次跳转规避焦点冲突
如果上述操作仍不生效,可先将焦点临时转移到主窗体其他可用控件,再切回UPCScan输入框:
Me!UPCScan = Null DoEvents Me.LotNum.SetFocus ' 先跳转到同主窗体的其他控件 Me.UPCScan.SetFocus ' 再切回目标输入框
4. 排查控件属性
检查UPCScan输入框的控件属性:
Enabled属性需设为TrueLocked属性需设为False
确保控件本身允许获得焦点。
5. 事件冲突兜底方案
如果这段代码是写在UPCScan的AfterUpdate事件中,事件执行过程中Access会默认持有当前控件焦点,可通过短延迟定时器执行焦点设置:
- 给主窗体添加计时器功能,
计时器间隔默认设为0 - 主窗体的计时器事件代码:
Private Sub Form_Timer() Me.TimerInterval = 0 ' 执行后关闭计时器 Me.UPCScan.SetFocus End Sub
- 将原来的SetFocus代码替换为启动计时器:
Me!UPCScan = Null Me.TimerInterval = 100 ' 100毫秒后执行焦点设置
内容的提问来源于stack exchange,提问作者HikerGuy
相关产品推荐
相关产品推荐

