从另一个表单刷新所有子表单
Posted
技术标签:
【中文标题】从另一个表单刷新所有子表单【英文标题】:Refresh All Subform from Another Form 【发布时间】:2017-11-16 04:14:34 【问题描述】:我有两种主要形式。一个是Dashboard,另一个是Edit。
编辑后,我有一个重新打开仪表板的按钮。 它可以打开仪表板,但我希望它刷新该仪表板中的子表单。
【问题讨论】:
为什么需要刷新子表单?仪表板打开时应该是“新鲜的”。您的意思是仪表板保持打开状态而您只是想返回它?Froms!Dashboard.Requery
将刷新Dashboard
表单中的数据,如果它打开的话。如果它是关闭的,只需打开它,当前数据将被加载到其中。确保EDIT
表单中的数据已更新到数据库。如果没有,请使用Me.Rfresh
将表单中的更改保存到数据库中。在this link 中查找以引用子表单
或者你可以在再次打开之前关闭仪表板吗?
【参考方案1】:
此模块将刷新您传递给它的表单以及所有子表单。重新查询通常会重置所选项目,因此在我们重新查询之前,我们会保存当前记录。如果重新查询后记录不存在,它将优雅地返回顶部而不会出错。
Public Sub RefreshForm(ByRef theForm As Form)
On Error GoTo ErrorHandling
Dim thisRecord As Long
thisRecord = theForm.CurrentRecord
Echo False
Dim childForm As Control
For Each childForm In theForm.Controls
If TypeOf childForm Is SubForm Then
childForm.Requery
End If
Next
With theForm
.Requery
.Recordset.Move thisRecord
End With
ErrorHandling:
Echo True
End Sub
要使用它,只需将其放在需要刷新的地方即可:
RefreshForm Me
【讨论】:
知道主表单的 simpleRequery
请求所有子表单(如果它们链接到主表单)?并且通过调暗thisRecord
作为枚举(AcRecord
),它幸运地得到了隐含的aLong
!在Requery
之后恢复表单位置的常用代码使用Bookmark属性。
您也不能依赖ControlType
,因为并非所有控件都具有该属性(例如活动 x 控件)。更好用If TypeOf childForm Is Subform Then
!
感谢@ComputerVersteher,但我之所以写这个是因为在我的主表单上重新查询没有重新查询子表单。我的子表单将显示一个应该被过滤的条目,只有对子表单的显式重新查询才能使条目按预期过滤。它肯定与 main 相关联。
奇怪,因为它对我有用。 Mainform 是否绑定到查询?请修复代码中容易出错的部分(Dim thisRecord As Long
andIf TypeOf childForm Is Subform
,删除或改进错误处理程序,因为它只是在没有通知的情况下退出)
@ComputerVersteher 错误处理程序的重点是确保 Echo 重新打开。这就是它所需要的。如果我删除了它,那么您可能会处于窗口不再更新的状态。【参考方案2】:
您不需要关闭并重新打开任何内容。任何打开的表单及其上的控件都可以从在任何地方运行的 VBA 代码中请求。它与子表单有点复杂。
要重新查询当前表单上的子表单控件:[SubformControlName].Requery
在当前表单的子表单控件中重新查询表单:[SubformControlName].Form.Requery
在当前窗体的子窗体中重新查询控件:[SubformControlName].Form.Controls("ControlName").Requery
要在应用程序的不同表单上执行上述任何操作,请以Forms![FormName].
为前缀
示例:Forms![FormName].[SubformControlName].Form.Controls("ControlName").Requery
【讨论】:
以上是关于从另一个表单刷新所有子表单的主要内容,如果未能解决你的问题,请参考以下文章