当从子窗体而不是父窗体调用browseto时,为什么Access 2010不会触发窗体卸载事件?

时间:2013-10-16 22:45:58

标签: navigation access-vba ms-access-2010

如上所述,这是Access 2010 .accdb。

我有一个主要的导航形式:frmNav。

在frmNav上我有一个Navigation子窗体控件:NavigationSubForm。

我使用docmd browseto在导航控件上的标签之间移动。

要在NavigationSubForm控件中加载的第一个表单是frmInboundShipments。

frmInboundShipments包含子表单控件sfrmListInvoicesByShipment。

sfrmListInvoicesByShipment包含与frmInboundShipments中每批货物相关联的已过滤发票数据表。

frmItemInvoices包含sfrmListInvoicesByShipment中引用的发票。

使用browseto命令 执行 在frmInboundShipments和frmItemInvoices之间移动的以下方法会触发frmInboundShipments上的UnLoad事件:

  1. 点击frmInboundShipments上的命令按钮以调用browseto到frmItemInvoices
  2. 点击frmNav导航控件上的导航标签/按钮,调用browseto frmItemInvoices。
  3. 但是,当我执行以下操作时,frmInboundShipments 上的UnLoad事件无法触发

    1. 双击sfrmListInvoicesByShipment中的字段/数据表行,触发browseto命令以显示/移动到frmItemInvoices:

      一个。立即执行docmd browseto以显示frmItemInvoices

      湾首先将焦点设置在父窗体上,然后执行docmd browseto以显示frmItemInvoices

       i. e.g.: Me.Parent.sfrmListInvoicesByShipments.SetFocus
      
                DoCmd.BrowseTo acBrowseToForm, "frmItemInvoices", "frmNav.NavigationSubform", ...criteria....
      
    2. 我无法理解为什么在从子窗体发出browseto命令时不触发事件的原因,而是在两个窗体之间导航时在每个其他场景中触发事件。

      我查看了Access 2010的事件顺序,我没有看到任何明确说明在从子窗体中查看另一个窗体时主窗体的Unload事件不会触发的内容。

      在这种情况下,Deactivate事件也不会触发。

      更新,10/18/13:进一步调查显示父窗体的Close事件确实触发,但绝对不是停用或卸载事件。问题是,一旦表单关闭事件发生,我想要捕获的值已经消失。不知道该怎么做......

1 个答案:

答案 0 :(得分:0)

rudelerius,

我感觉到你的痛苦。我有很长时间调试Access Form事件的经验,并且已经有了几个规则:

  1. 表格事件并不总是在你期望的时候发生。
  2. 表单事件并不总是按特定顺序触发,尽管文档可能会说。
  3. 最后,通过在事件过程中放置​​一个断点进行调试可以更改被触发的事件的 order number
  4. 那你能做什么?我的建议:

    1. 表单事件用于处理表单级操作。它们只是管道,你不应该使用应用程序级函数重载它们
    2. 将您的应用程序或业务逻辑与表单分开,尤其是不要将业务逻辑插入任何表单或报表事件。换句话说,支持你的应用程序所做的代码的代码应该与如何分开。
    3. 要进行调试,请在事件过程中使用Debug.Print之类的内容,并避免使用Breakpoints。
    4. 那么,这对你有什么帮助?我的(必然是广义的)答案是在您采取表单操作之前将任何想要保留的信息放在外部模块级变量或类 之前。然后,您的主表单可以使用该信息,而不依赖于孩子的状态。