无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?

Posted

技术标签:

【中文标题】无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?【英文标题】:Any way to fire an event after any control on a form updates, regardless of the control?无论控件如何,在表单上的任何控件更新后有什么方法可以触发事件? 【发布时间】:2016-08-19 19:01:56 【问题描述】:

我需要做的是跟踪用户更改的任何字段,并且我使用的表单是连续表单。数据是客户数据。因此,如果用户更改了客户的姓氏,然后更改了同一客户的邮政编码,我需要将该信息存储在某处,以便将其写入报告。

存储部分没有问题,报表也没有问题。我最关心的是必须编写 30 个(是的,有 30 个字段……)AfterUpdate 事件。我觉得我可能忽略了一种更简单的方法。

我知道表单的 OnDirty 事件只会触发一次。一旦表单脏了,它就是脏的。每次更新控件时都会触发一些表单级事件吗?

【问题讨论】:

可以选择 jQuery 吗? 使用if me.Dirty then me.dirty = false ? @KobiTate - 不幸的是,这是一个 Access 应用程序。我们最终会移植它,但现在我只需要创可贴。 哦,哈哈,我刚刚回答了一些与 html 等相关的问题,所以我没有意识到这个问题的目的。我的坏...继续。 可以通过事件监听类来完成。需要更多的初始设置,但可能会激发一个想法:link 【参考方案1】:

当“任何”控件发生更改时,不会触发任何事件。事实上,我不知道有任何开发平台会为任何控件触发事件,除非您为每个控件编写代码——其中包括那些再次需要为每个控件编写代码的事件侦听器类。 (它们往往是一个非常脑死的解决方案,因为无论如何你最终都会为每个控件编写代码!)

但是,给定表单存在记录级别事件。因此,如果更改了任何控件,则更新事件之前的表单将触发。在这种情况下,您仍然可以在该时间点检查旧值(先前值)和当前值,然后再将记录提交到表中。

所以在更新前的活动中你可以这样:

  Private Sub Form_BeforeUpdate(Cancel As Integer)

     ' this event does not fire UNLESS the reocrd be change,
     ' send to debug window each control that been changed.

     Dim myControl     As Control

     For Each myControl In Me.Controls

        Select Case myControl.ControlType

           Case acTextBox, acListBox, acComboBox

              ' text box control, check old vs new value
              ' but ONLY check for controls that are bound
              ' to data

              If myControl.ControlSource <> "" Then

                 If myControl.OldValue <> myControl.Value Then

                    Debug.Print "control " & myControl.Name & " was Changeed from" & "" & _
                                Nz(myControl.OldValue, "") & " ->" & Nz(myControl.Value, "")
                 End If
              End If

      End Select

     Next myControl

  End Sub

因此,上面将向调试窗口发送用户更改的控件“列表”。我在上面使用了一个选择案例,因为您可能需要特殊代码来表示列表框、组合框等。

【讨论】:

以上是关于无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

表单中<label>标签有啥用?

Access 2007 / VBA - 多个表单实例,从模块更新特定实例的控件

Angular 2 - 自定义表单控件 - 禁用

Excel 2010 中的“表单控件”和“ActiveX 控件”有啥区别?

受保护工作表上的表单控件

如何从包含任何容器中的控件的表单中获取所有控件?