我需要做的是跟踪用户更改的任何字段,我使用的表单是连续表单。数据是客户数据。因此,如果用户更改了客户的姓氏,然后更改了同一客户的邮政编码,我需要将该信息存储在某处,以便将其写入报告。
存储部分没问题,报告也没问题。我最关心的是必须写30个(是的,那里有30个字段......)AfterUpdate事件。我觉得这可能是一种我更容易忽视的方式。
我知道表单的OnDirty事件只触发一次。一旦表格变脏,它就变脏了。是否有一些表单级事件会在每次更新控件时触发?
答案 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;用户更改的控件的数量。我使用了上面的一个选择案例,因为您可能需要特殊代码来表示列表框,组合框等。