【问题标题】:Why would Access 2010 not trigger the form unload event when browseto is invoked from subform, instead of parent form?当从子表单而不是父表单调用 browseto 时,为什么 Access 2010 不会触发表单卸载事件?
【发布时间】:2013-10-25 06:24:24
【问题描述】:

如上所述,这是一个 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。

但是,当我执行以下操作时,frmInboundShipments 上的 UnLoad 事件无法触发

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

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

    b.先将焦点放在父窗体上,然后执行docmd browseto 显示frmItemInvoices

     i. e.g.: Me.Parent.sfrmListInvoicesByShipments.SetFocus
    
              DoCmd.BrowseTo acBrowseToForm, "frmItemInvoices", "frmNav.NavigationSubform", ...criteria....
    

我一生都无法理解为什么当从子表单发出 browseto 命令时事件不会触发,而是在两个表单之间导航时在所有其他情况下触发。

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

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

更新,2013 年 10 月 18 日:进一步调查显示父窗体的 Close 事件确实触发,但绝对不是 deactivate 或 unload 事件。问题是一旦表单关闭事件发生,我想要捕获的值就已经消失了。不知道从这里做什么......

【问题讨论】:

  • 我暂时不会关闭它,但我确实找到了解决方法:当从子表单调用 browseto 时,我决定不捕获父表单的卸载事件中的值,而是将数据捕获移动到子窗体控件的 Enter 事件。最终结果可能是它被更频繁地编写,当用户通过子表单控件进行选项卡或去搜索该表单中的值等时。最终,它实现了目标。我仍然很想知道为什么卸载永远不会触发。至少在这种情况下,关于子表单事件顺序的 MS 文档确实不够充分。
  • 我发现在 Access 中,为了处置一个表单,它需要先关闭然后处置。在我以前的使用中,VBA 不允许处理打开的(可见或不可见)表单。不幸的是,当涉及到 VBA 时,您必须细化,如果您不告诉它这样做,它就不会暗示它。
  • 您是否尝试过从父表单而不是子表单触发 BrowseTo 命令?如果(我假设)子表单上有一个重要的变量,您可以将它传递给公共字符串并在触发代码时使用该字符串?

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


【解决方案1】:

鲁德莱里乌斯,

我感觉到你的痛苦。我在调试 Access Form 事件方面有很长的经验,并且得出了几条规则:

  1. 表单事件并不总是按预期触发。
  2. 表单事件并不总是按特定顺序触发,尽管文档可能会这样说。
  3. 最后,通过在事件过程中放置​​断点进行调试可以更改触发事件的顺序数量

那你能做什么?我的建议:

  1. 表单事件用于处理表单级别的操作。它们只是管道,您不应该使用应用程序级函数重载它们
  2. 将应用程序或业务逻辑与表单分开,尤其不要将业务逻辑插入任何表单或报告事件。换句话说,支持您的应用程序做什么的代码应该与如何它是分开的。
  3. 对于调试,在事件过程中使用Debug.Print 之类的东西,并避免使用断点。

那么,这对您有什么帮助?我的(必须是广泛的)答案是将您想要保留的任何信息放在外部模块级变量或类中,您采取表单操作之前。然后,您的主表单可以使用该信息,而无需依赖孩子的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 2013-01-01
    • 2019-09-25
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多