在对表单进行任何控制后,无论控制如何,都可以通过任何方式触发事件?

时间:2016-08-19 19:01:56

标签: forms vba ms-access ms-access-2013

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

存储部分没问题,报告也没问题。我最关心的是必须写30个(是的,那里有30个字段......)AfterUpdate事件。我觉得这可能是一种我更容易忽视的方式。

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

1 个答案:

答案 0 :(得分:1)

更改“任何”控件时不会触发任何事件。事实上,我不知道任何开发平台为任何控件触发事件,除非你为每个控件编写代码 - 并且包括那些AGAIN需要每个控件的代码的事件监听器类。 (它们往往是一个真正的脑死亡解决方案,因为你总是为每个控件编写代码!)

但是,给定表单有记录级事件。因此,如果更改了任何控件,则将触发更新事件之前的表单。在那种情况下,你可以在那个时间点检查旧值(前一个值)和记录提交到表之前的当前值。

所以在更新前的事件中你可以这样:

  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

以上将向调试窗口发送一个&#34; list&#34;用户更改的控件的数量。我使用了上面的一个选择案例,因为您可能需要特殊代码来表示列表框,组合框等。