无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?
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
因此,上面将向调试窗口发送用户更改的控件“列表”。我在上面使用了一个选择案例,因为您可能需要特殊代码来表示列表框、组合框等。
【讨论】:
以上是关于无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?的主要内容,如果未能解决你的问题,请参考以下文章
Access 2007 / VBA - 多个表单实例,从模块更新特定实例的控件