单一操作(例如从一个对象上的控件移动到另一控件)可以触发多个不同的事件,这些事件按特定顺序发生。 了解事件发生的时间和顺序非常重要,因为这会影响宏或事件过程的运行方式和运行时间。 例如,如果有两个事件过程将按特定顺序运行,则需要确保关联的事件以相同顺序发生。
本文内容
窗体上控件事件的顺序
将焦点移动到控件以及在控件中更改和更新数据时,窗体上会发生控件事件。
注意: Microsoft Office Access 在 Visual Basic 编辑器中显示的事件名称与在属性表和“宏生成器”中显示的名称略有不同。 例如,窗体的属性表和“宏生成器”中名为“获得焦点”(On Got Focus) 的事件在 Visual Basic 编辑器中名为 GotFocus。 本文中的示例对事件名称使用 Visual Basic for Applications (VBA) 格式。
将焦点移动到控件
将焦点移动到窗体上的控件时(例如,打开包含一个或多个活动控件的窗体,或将焦点移动到同一窗体上的其他控件),进入和获得焦点事件将按如下顺序发生:
输入 GotFocus
打开窗体时,进入和获得焦点事件将在与打开窗体关联的事件(例如,打开、激活和成为当前)后发生,如下所示:
打开 (窗体) 激活 当前 (窗体) 窗体 (窗体) 输入 (控件) GotFocus (控件)
当焦点离开窗体上的控件时(例如,关闭包含一个或多个活动控件的窗体,或将焦点移动到同一窗体上的其他控件),退出和失去焦点事件将按如下顺序发生:
退出 LostFocus
关闭窗体时,退出和失去焦点事件将在与关闭窗体关联的事件(例如卸载、停用和关闭)前发生,如下所示:
退出 (控件) LostFocus (控件) 卸载 (窗体) 停用 (窗体) 关闭 (窗体)
更改和更新控件中的数据
在窗体上的控件中输入或更改数据,然后将焦点移动到另一控件时,将发生更新前和更新后事件:
BeforeUpdate Afte rUpdate
其值已更改的控件的退出和失去焦点事件在更新前和更新后事件后发生:
BeforeUpdate AfterUpdate Exit LostFocus
更改文本框中的文本或组合框的文本框部分中的文本时,将发生更改事件。 只要控件的内容发生更改,此事件就会在将焦点移动到另一控件或记录之前(因此,在更新前和更新后事件发生之前)发生。 对于在文本框或组合框的文本框部分中按下的每个键,都会依序发生下列事件:
KeyDown KeyPress Dirty Change KeyUp
如果在组合框列表中未列出的组合框中输入一个值,然后尝试将焦点移动到另一个控件或记录,则将发生不在列表中事件。 不在列表中事件发生在组合框的键盘事件和更改事件后,但发生在任何其他控件或窗体事件前。 如果组合框的“限于列表”属性设置为“是”,则将在不在列表中事件后立即发生该窗体的出错事件:
KeyDown KeyPress Dirty Change KeyUp NotInList 0 错误
窗体上记录事件的顺序
在将焦点移动到其他记录、更新记录中的数据、删除现有记录或创建新记录时,窗体上会发生记录事件。
将焦点移动到记录并更新记录中的数据
将焦点移动到窗体上的现有记录,在记录中输入或更改数据,然后将焦点移动到另一记录时,将依序发生下列窗体事件:
当前 (窗体) BeforeUpdate (窗体) AfterUpdate (窗体) 当前 (窗体)
在离开其数据已发生更改的记录后,对于具有焦点的控件,将在输入下一记录之前发生退出和失去焦点事件。 这些事件发生在窗体的更新前和更新后事件之后,如下所示:
BeforeUpdate (窗体) AfterUpdate (窗体) Exit (控件) LostFocus (控件) 当前 (窗体)
在窗体上的控件之间移动焦点时,将发生针对每个控件的事件。 例如,执行以下操作时,会依序发生下列事件:
-
打开窗体,并更改控件中的数据:
当前 (窗体) 输入 (控件) GotFocus (控件) BeforeUpdate (控件) AfterUpdate (控件)
-
将焦点移到另一控件:
Exit (control1) LostFocus (control1) Enter (control2) GotFocus (control2)
-
将焦点移动到另一记录:
BeforeUpdate (form) AfterUpdate (form) Exit (control2) LostFocus (control2) Current (form)
删除记录
删除记录时,将发生下列窗体事件,并且 Microsoft Office Access 会显示一个对话框,请求确认删除:
删除 BeforeDelConfirm AfterDelConfirm
如果取消确认删除前事件,则不会发生确认删除前和确认删除后事件,也不会显示对话框。
创建新记录
将焦点移动到窗体上的新(空白)记录,然后通过在控件中键入数据创建新记录时,将依序发生下列事件:
当前 (窗体) 输入 (控件) GotFocus (控件) BeforeInsert (窗体) AfterInsert (窗体)
BeforeInsert (窗体) 事件触发器,只要你开始在 控件中键入。 AfterInsert (窗体) 事件触发器后退出记录。
窗体上的控件和新记录的更新前和更新后事件发生在插入前事件之后,插入后事件之前。
窗体和子窗体事件的顺序
打开或关闭窗体、在窗体之间移动,或者处理窗体或子窗体上的数据时,将发生窗体事件。
打开和关闭窗体
打开窗体时,将依序发生下列窗体事件:
打开 加载 重设大小 激活当前
如果窗体上没有活动控件,则窗体的获得焦点事件发生在激活事件之后,成为当前事件之前。
关闭窗体时,将依序发生下列窗体事件:
卸载 停用 关闭
如果窗体上没有活动控件,则窗体的失去焦点事件发生在卸载事件之后,停用事件之前。
在窗体之间移动
在两个打开的窗体之间切换时,第一个窗体将发生停用事件,第二个窗体将发生激活事件:
停用 (form1) 激活 form2) (
从窗体切换到 Access 中的另一对象选项卡时,该窗体也会发生停用事件。 但是,在切换到对话框、“弹出方式”属性设置为“是”的窗体或其他程序中的窗口时,不会发生停用事件。
注意: 如果将焦点移动到已打开的窗体,那么即使是通过执行打开窗体操作将焦点移动到该窗体,也不会发生打开事件。
处理窗体上的数据
在窗体中的记录间移动和更改数据时,将发生窗体事件和控件事件。 例如,首次打开窗体时,将依序发生下列事件:
打开 (窗体) 加载 (窗体) 重设窗体大小 (窗体) 激活当前 (窗体) (窗体) 输入 (控件)0 GotFocus (控件)
同样,关闭窗体时,将依序发生下列事件:
退出 (控件) LostFocus (控件) 卸载 (窗体) 停用 (窗体) 关闭 (窗体)
如果更改了控件中的数据,则将在控件的退出事件之前发生控件和窗体的更新前和更新后事件。
使用子窗体
打开包含子窗体的窗体时,将在加载主窗体前先加载子窗体及其记录。 因此,子窗体及其控件的事件(例如打开、成为当前、进入和获得焦点)在窗体事件之前发生。 但是,不会发生子窗体激活事件。 因此,打开主窗体仅触发主窗体激活事件。
同样,关闭包含子窗体的窗体时,将在卸载该窗体后卸载子窗体及其记录。 不会发生子窗体停用事件。 因此,关闭主窗体仅触发主窗体停用事件。 控件、窗体和子窗体事件按下列顺序发生:
-
子窗体控件事件(例如,退出和失去焦点)
-
窗体控件(包括子窗体控件)事件
-
窗体事件(例如,停用和关闭)
-
子窗体事件
注意: 由于子窗体事件在主窗体关闭之后发生,因此不会发生某些事件(例如从子窗体的事件中取消关闭主窗体)。 可能需要将这些类型的验证测试移动到主窗体上的事件。
击键和鼠标单击事件的顺序
如果窗体或控件具有焦点,则在按键或发送击键时,将发生窗体和控件的键盘事件。 当鼠标指针悬停在窗体、窗体分区或窗体上的控件上时,单击鼠标按钮会触发该窗体、分区和控件的鼠标事件。 将鼠标指针悬停在窗体、分区或控件上时,也会发生鼠标事件。
键盘事件
如果窗体上的控件具有焦点,则在按下并释放键(或者使用发送键 操作或 语句 发送击键)时,将依序发生下列事件:
KeyDown KeyPress KeyUp
按下并释放键,或发送 ANSI 字符集 中的击键时,键按下、击键和键释放事件均会发生。 如果按住一个 ANSI 键,则键按下和击键事件会交替发生(键按下、击键、键按下、击键,依此类推),直到释放该键;然后将发生键释放事件。
如果按下并释放一个非 ANSI 键,则将发生键按下和键释放事件。 如果按住一个非 ANSI 键,则将反复发生键按下事件,直到释放该键,然后将发生键释放事件。
如果按某个键会触发控件的另一个事件,则该事件在击键事件之后、键释放事件之前发生。 例如,如果某个击键更改了文本框中的文本,从而触发了更改事件,则将依序发生下列事件:
KeyDown KeyPress Change KeyUp
如果击键导致焦点从一个控件移动到另一个控件,则第一个控件将发生键按下事件,而第二个控件将发生击键和键释放事件。 例如,如果更改控件中的数据,然后按 TAB 键移到下一个控件,则将依序发生下列事件:
-
第一个控件:
KeyDown BeforeUpdate AfterUpdate Exit LostFocus
-
第二个控件:
输入 GotFocus KeyPress KeyUp
鼠标事件
如果鼠标指针悬停在窗体的控件上,则在单击然后释放鼠标按钮时,将依序发生下列控件事件:
MouseDown MouseUp Click
如果控件具有焦点,则在通过单击将焦点移动到第二个控件时,将依序发生下列事件:
-
第一个控件:
退出 LostFocus
-
第二个控件:
输入 GotFocus MouseDown MouseUp 单击
如果移动到另一记录,然后单击控件,则在发生控件的进入事件之前,还将发生窗体的成为当前事件。
双击控件导致单击和双击事件均会发生。 例如,双击除命令按钮之外的控件时,将依序发生该控件的下列事件:
MouseD 自己的 MouseUp 单击 DblClick MouseUp
双击命令按钮时,将依序发生上述事件,然后再次发生单击事件。
将鼠标指针悬停在窗体、分区或控件上时,窗体、分区或控件将发生鼠标移动事件。 此事件独立于其他鼠标事件。
报表和报表区域事件的顺序
打开报表进行打印或预览,或关闭报表时,将发生报表和报表区域事件。
报表事件
打开报表进行打印或预览,然后关闭该报表,或移动到 Access 中的另一对象选项卡时,将依序发生下列报表事件:
打开 激活 关闭 停用
在两个打开的报表之间切换时,第一个报表将发生停用事件,第二个报表将发生激活事件:
停用 (report1) 激活 (report2)
从报表切换到 Access 中的另一对象选项卡时,该报表也会发生停用事件。 但是,在切换到对话框、“弹出方式”属性设置为“是”的窗体或其他程序中的窗口时,不会发生停用事件。
打开基于查询的报表时,Access 将在运行基础查询之前触发该报表的打开事件。 因此,可以使用响应打开事件的宏或事件过程来设置报表的条件。 例如,宏或事件过程可以打开用于输入报表条件的自定义对话框。
报表区域事件
打印或预览报表时,报表区域的格式和打印事件将在报表的打开和激活事件之后、关闭或停用事件之前发生:
打开 (报表) 激活 (报表) 格式 (报表部分) 打印 (报表部分) 关闭 (报表) 停用 (报表)
安全性 可以使用报表视图启用 报表的用户筛选。 但与“打印预览”不同,报表视图中不会显示任何部分中 的“格式” 和“ 打印 ”事件。 这也适用于在控件中显示的 VBA 函数结果和用户定义的过程,这些 (这些事件中的标签标题、显示状态、条件格式设置、控件大小调整等) 。 因此,请勿在此事件中使用代码来格式化、隐藏或打印可能会公开的机密数据。 建议通过将 AllowReportView 属性设置为“否”来预先筛选数据或禁用报表预览。
此外,将在设置格式的过程中或设置格式之后、打印事件之前发生以下事件:
-
如果 Access 在设置报表格式的过程中返回之前的区域,则将发生撤消时事件。
-
如果报表未显示任何记录,则将发生无数据事件。
-
打印页前事件在设置格式之后、打印之前发生。 此事件可用于自定义打印报表的外观。