【问题标题】:BeforeUpdate event of a linked subform control firing multiple times链接的子表单控件的 BeforeUpdate 事件多次触发
【发布时间】:2015-05-27 05:06:15
【问题描述】:

下午好,

我必须维护一个 Access 表单,其中包含一个链接的子表单(使用 Master 和 Child 字段)。

基本上,在主窗体中,用户在组合框中选择一个值,子窗体会自动更新。

我的问题是我的子表单的一个字段上有一个 BeforeUpdate 事件,当它不符合条件时阻止更新该字段 (Cancel=true)。如果字段中有任何错误,则警报消息框应该出现一次,但 BeforeUpdate 事件总是因未知原因被触发 3 次。

我创建了一个简单的 accdb 文件来重现我的问题。它位于此处:https://www.hightail.com/download/bXBhU2V0Q1JxRTFsQXNUQw

打开Form1,在组合框中选择一个值,然后尝试用X更新子表单中的一个字母,你会得到多次出现的msgbox。

提前感谢您在这个问题上的帮助,因为它让我发疯了。

西尔万

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    发生这种情况是因为您没有将 Text0 的值改回原来的值。

    试试这个

    Private Sub Text0_BeforeUpdate(Cancel As Integer)
        If Me.Text0 = "X" Then
            MsgBox "Wrong value"
            Cancel = True
            Me.Text0.Undo
        End If
    End Sub
    

    【讨论】:

    • 感谢@DivisionX,但我想了解它为什么会这样。如果我直接将我的子表单作为主表单打开(在我的示例中为 Form2)并且我用不正确的内容更新了该字段,则 BeforeUpdate 将只被触发一次,因为它应该是。在链接子表单的情况下,导致该事件被多次触发的事件顺序是什么??
    • 这只是一个理论,但会不会是因为form 2是from 1的子form,所以是先更新form 1,再更新form 2,再更新form 1?
    • 在您的代码中放置一个断点并观察执行流程。访问中的事件被链接并按特定顺序...
    【解决方案2】:

    OK 终于找到解决办法了。

    它与用于存储我的子表单使用的链接主字段的文本框有关。此控件包含我的组合框的值,以便过滤掉我的子表单。

    该链接主字段的控制源定义原为:

    =myCombobox.column(0)
    

    只需将定义替换为:

    =myCombobox
    

    我的链接子表单中的 beforeUpdate 事件仅触发一次,并且按预期运行;

    Private Sub Text0_BeforeUpdate(Cancel As Integer)
        If Me.Text0 = "X" Then
            MsgBox "Wrong Value"
            Cancel = True
        End If
    End Sub
    

    我无法解释它为什么会这样的神奇之处,但这就是我让它发挥作用的方式。

    西尔万

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 2018-11-26
      • 1970-01-01
      • 2021-10-11
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2018-04-29
      相关资源
      最近更新 更多