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

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属性需设为True
  • Locked属性需设为False
    确保控件本身允许获得焦点。

5. 事件冲突兜底方案

如果这段代码是写在UPCScan的AfterUpdate事件中,事件执行过程中Access会默认持有当前控件焦点,可通过短延迟定时器执行焦点设置:

  1. 给主窗体添加计时器功能,计时器间隔默认设为0
  2. 主窗体的计时器事件代码:
Private Sub Form_Timer()
    Me.TimerInterval = 0 ' 执行后关闭计时器
    Me.UPCScan.SetFocus
End Sub
  1. 将原来的SetFocus代码替换为启动计时器:
Me!UPCScan = Null
Me.TimerInterval = 100 ' 100毫秒后执行焦点设置

内容的提问来源于stack exchange,提问作者HikerGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:27:02