BeforeUpdate 事件在控件中的数据被改变或记录被更新之前发生。
Private Sub object_BeforeUpdate(Cancel As Integer)
Object 窗体或控件的名称。
Cancel 该设置确定是否发生 BeforeUpdate 事件。将 Cancel 参数设为 True (–1) 可取消 BeforeUpdate 事件。
通过使用 Visual Basic 或含有 SetValue 操作的宏来更改控件中的数据时,不会触发这些事件。但是,如果随后移动到另一条记录或保存该记录,该窗体的 BeforeUpdate 事件便会发生。
BeforeUpdate 事件仅适用于窗体上的控件,不适用于报表上的控件。
BeforeUpdate 事件不适用于选项组中的选项按钮、复选框或切换按钮,而仅适用于选项组本身。
说明
若要在该事件发生时运行宏或事件过程,请将 BeforeUpdate 属性设置为宏的名称或 [事件过程]。
在控件或记录更新时,将会触发 BeforeUpdate 事件。在其中的一条记录中,当控件失去焦点或用户按 Enter 或 Tab 时,每个控件中被更改的数据都将更新;当焦点离开记录或用户在“记录”菜单中选择“保存记录”命令时,整条记录都将更新且数据将保存在数据库中。
在窗体的控件中输入新数据或更改数据,并移到另一条记录或在“记录”菜单中选择“保存记录”命令来保存记录时,窗体的 BeforeUpdate 事件将紧跟着控件的 BeforeUpdate 事件发生。移动到另一条记录时,控件的 Exit 和 LostFocus 事件将发生,接着指针移到的记录的 Current 事件以及这条记录中第一个控件的 Enter 和 GotFocus 事件发生。若要运行 BeforeUpdate 宏或事件过程而不想运行 Exit 和 LostFocus 宏或事件过程,请在“记录”菜单中选择“保存记录”命令。
BeforeUpdate 宏和事件过程只有在更改控件中的数据时才会运行。计算控件中值的改变不会触发这些事件。只有更改了记录中的一个或多个控件数据时,窗体的 BeforeUpdate 宏和事件过程才会发生。
对于窗体,可以使用 BeforeUpdate 事件在移到另一记录之前取消对记录的更新。
即使用户在控件中键入了新值,OldValue 属性设置仍然必须等到数据被保存(记录被更新)之后才能更改。如果取消更新,OldValue 属性值将替换控件中已有的值。
通常使用 BeforeUpdate 事件来验证数据的有效性,特别是在运行复杂的有效性检验时,例如:
? | 一个窗体上有多个值的情况。 |
? | 对不同的输入数据显示不同的错误消息。 |
? | 能被用户覆盖。 |
? | 包含对其他窗体上控件的引用或包含用户定义的函数。 |
注意 若要实施或简单或复杂的有效性规则,例如在字段中要求一个值或在窗体上验证多个控件,可以使用控件的 ValidationRule 属性以及表中字段和记录的 ValidationRule 和 Required 属性。
如果您试图修改在事件过程中激活 BeforeUpdate 事件的控件内所包含的数据,则会发生运行时错误。
如果要将窗体的全部有效性验证存储在一个宏组中,或者,如果让几个窗体使用一个有效性验证表达式,则可以使用 BeforeUpdate 宏。
例如,假定用户在窗体上的“国家/地区”控件中输入了某个国家/地区的名称,并在“邮政编码”控件中输入了该国家/地区的相应邮政编码,则在宏中使用条件表达式可确保在“国家/地区”控件中输入的数据与在“邮政编码”控件中输入的数据相对应,并且,当在“邮政编码”控件中输入的数据无效时会显示一条消息。
使用 AfterUpdate 宏,可以显示其他窗体页,或者将焦点移至特定控件或记录。例如,当用户在窗体的“类别”控件中输入值时,可以使用 AfterUpdate 宏中的 GoToPage 操作将焦点移至包含该类别控件的窗体页。
可以在 BeforeUpdate 宏中使用 CancelEvent 操作来取消更新。如果 BeforeUpdate 宏附加到某个控件,则 CancelEvent 操作会把焦点返回到该控件,并且用户输入的数据会留在该控件中。
如果 BeforeUpdate 宏附加到某个窗体(每次更改记录时,它会在该窗体中运行),CancelEvent 操作会将焦点返回到该记录。
不能在 AfterUpdate 宏中使用 CancelEvent 操作来取消 AfterUpdate 事件。
以下示例说明如何使用 BeforeUpdate 事件过程来检查产品名称是否已经输入到数据库中。当用户在“产品名称”框中输入产品名称时,这个值将与“产品”表中的“产品名称”字段相比较,如果在“产品”表中有相符的值时,将显示一条消息通知用户该产品已经被输入。
若要试用该示例,请将下列事件过程添加到名为“产品”的窗体中,而且该窗体要含有一个名为“产品名称”的文本框。
Private Sub ProductName_BeforeUpdate(Cancel As Integer)
If(Not IsNull(DLookup("[ProductName]", _
"Products", "[ProductName] ='" _
& Me!ProductName & "'"))) Then
MsgBox "Product has already been entered in the database."
Cancel = True
Me!ProductName.Undo
End If
End Sub