如何从另一个表单重新查询子表单?

Ton*_* L. 11 forms ms-access vba access-vba

我一直在努力解决这个问题,然后在一些帮助下,然后搜索它; 但我没有运气.所以我决定问.

我有两种形式在Access 2007中可以称他们为MainFormEntryForm.
MainForm有一个子表单和一个按钮.该按钮EntryForm在添加模式下打开.我想要做的是EntryForm保存它将更新(重新查询)子表单的新记录MainForm.

我试过这个设置代码

Private Sub cmdSaveAndClose_Click()
    DoCmd.Save

    'requery list
    Forms![MainForm]![subformName].Requery

    '' I've also tried these
    'Forms![MainForm]![subformName].Form.Requery
    'Forms.("MainForm").[subformName].Requery
    'Forms.("MainForm").[subformName].Form.Requery


    DoCmd.Close
End Sub
Run Code Online (Sandbox Code Playgroud)

这些尝试似乎都不起作用.有没有办法解决这个问题?我在这里先向您的帮助表示感谢.

Fio*_*ala 15

您必须使用子窗体控件的名称,而不是子窗体的名称,尽管这些通常是相同的:

 Forms![MainForm]![subform control name Name].Form.Requery
Run Code Online (Sandbox Code Playgroud)

或者,如果您在主表单上:

 Me.[subform control name Name].Form.Requery
Run Code Online (Sandbox Code Playgroud)

更多信息:http://www.mvps.org/access/forms/frm0031.htm

  • 的.运算符依赖于您无法控制的隐式创建的属性(这就是Me.ControlName如何受编译时检查,因为它周围有一个隐藏的属性包装器).这导致VBA代码损坏趋势略有增加.有些人发现编译时检查和更好的Intellisense值得冒这个风险.我不 - 我总是使用!运营商.没有可能产生真实世界差异的性能差异. (2认同)

Dav*_*ton 9

只是对完成此方法的方法发表评论:

您将EntryForm永久地绑定到您正在调用它的表单上.我认为最好不要将形式与这样的背景联系起来.我将从Save/Close例程中删除requery,而是使用acDialog开关以模态方式打开EntryForm:

  DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
  Me!SubForm.Form.Requery
Run Code Online (Sandbox Code Playgroud)

这样,EntryForm就无法在一个上下文中使用.另一种方法是使EntryForm复杂化,这些知识可以通过哪种形式打开它以及需要重新获取的内容.我认为最好将这类内容保持在与其使用的上下文接近的位置,并尽可能简化被调用表单的代码.

也许这里的一个原则是,无论何时你使用另一种形式的Forms集合重新查找表单,这都是一个很好的迹象表明你的架构不正确 - 在我看来这应该很少发生.