无法复制表单中的全部刷新快速访问工具栏按钮

Posted

技术标签:

【中文标题】无法复制表单中的全部刷新快速访问工具栏按钮【英文标题】:Unable to replicate Refresh All quick access toolbar button in form 【发布时间】:2018-04-22 23:11:11 【问题描述】:

我有一个包含几个子表单的表单,其内容在单独的表单中编辑,由命令按钮打开。

当这些表单中的数据被更新,并且额外的表单关闭时,自然需要刷新主表单才能看到这些更改。单击 Refresh All 快速访问工具栏按钮可以完美地实现这一点。

所以我在主窗体上为“获得焦点”事件制作了一个宏来刷新它,但它什么也没做。我也尝试了重新绘制和重新查询,将后者专门应用于有问题的子表单,并将它们从 vba 中运行出来,而不是使用构建的访问接口宏,这些似乎都不能解决问题。

vba 编码:

Private Sub Form_GotFocus()

Screen.ActiveForm.Requery
Screen.ActiveForm.Repaint
Screen.ActiveForm.Refresh
Me.sfmContact.Requery
Me.frmCustCert.Requery
Me.frmCustReq.Requery

End Sub

烦人的是,如果我把它(甚至只是宏或Screen.ActiveForm.Refresh)放在其中一个控件的点击事件中,它就可以正常工作。似乎无法让它在任何不需要最终用户思考或点击的自动事件中工作。

这个问题有点像Refresh button on an Access form 的欺骗,但这个问题已经存在一年多了,没有公认的答案。所以我对它进行了扩展。

【问题讨论】:

它甚至在 GotFocus 事件中运行代码吗?您可能想尝试 Form_Activate 事件 我的猜测是它没有运行它,但我不知道为什么。我在 OnActivate 和 OnLoad 之间搞混了,这就是我没有尝试该选项的原因。这有效并解决了问题,但为什么 GotFocus 不火呢?当另一个表单获取它进行更新时,主表单肯定会失去焦点,然后当另一个表单关闭/选择主表单中的任何内容时,它又会重新获得焦点...... 很高兴它为您工作。跟踪 VBA 事件进展是生活中令人不快的任务之一。 【参考方案1】:

您在评论中提到的内容是正确的:

我的猜测是它没有运行它,但我不知道为什么。我在 OnActivate 和 OnLoad 之间搞混了,这就是我没有尝试该选项的原因。这有效并解决了问题,但为什么 GotFocus 不火呢?当然,当另一个表单获取它进行更新时,主表单失去了焦点,然后当另一个表单关闭/主表单中的任何内容被选中时,它又恢复了焦点......

为避免将来出现此类错误,谨慎的做法是在代码中专门命名表单,而不是使用“我”。命令,因为这只适用于当前焦点。例如:

Me.sfmContact.Requery > Forms![FormName].sfmContact.Requery

或者,您可以在进行此类编码之前将焦点设置在相关表单上。

Forms![FormName].SetFocus

【讨论】:

我想我只是处理了你的意思:你是说 原因 GotFocus 没有做任何事情不是因为它没有触发,而是是因为它在表单(或任何对象)获得焦点时触发但在它激活之前?所以ActiveFormMe. 都指的是活动 发生在之后 事情获得焦点?因此,如果我将其更改为 bang 符号,显式引用表单/表单控件,它仍然可以在 GotFocus 事件上工作? 焦点对于表单来说不是一件自然的事情。换句话说,当它打开时,GotFocus 命令将永远不会触发,因为表单无法接收到GotFocus 事件。这种类型的触发器通常只用于子表单。通常,在这种情况下,您可以使用OnLoad(如果您希望在首次打开表单时触发事件)或辅助操作(例如按下按钮或激活复选框等)。 )。从技术上讲,表单可以在表单上的所有可见控件都被禁用或表单上没有控件的特定情况下接收焦点。

以上是关于无法复制表单中的全部刷新快速访问工具栏按钮的主要内容,如果未能解决你的问题,请参考以下文章

无法从快速访问工具栏 (QAT) 菜单中删除自定义功能区控件

功能区 MFC 中未显示快速访问工具栏 (QAT)

WIN10 无法取消 快速访问 固定

facebooksdk 无法快速获取访问令牌

使用更新的参数集无法从 VB 关闭或刷新访问报表

快速访问中的ftp怎样删除