在 Microsoft Access 项目(.adp)或 Access 数据库(.mdb)中可以发生 Filter 事件。
Private Sub Form_Filter(Cancel As Integer, FilterType As Integer)
Cancel 该设置确定是否打开筛选窗口。将 Cancel 参数设置为 True (–1) 可阻止打开筛选窗口。还可以使用 DoCmd 对象的 CancelEvent 方法取消打开筛选窗口。
FilterType 用户尝试打开的筛选器窗口。FilterType 参数可以是以下固有常量之一:
常量值
acFilterByForm 0
acFilterAdvanced 1
acServerFilterByForm 2
当用户在 Access 数据库中执行下列操作时,Filter 事件发生:
? | 在“窗体”视图中的“记录”菜单上,指向“筛选”,然后单击“高级筛选/排序”。这样将打开“高级筛选/排序”窗口,在此窗口中可为窗体创建复杂的筛选。 |
? | 在“按窗体筛选”窗口打开时,在“筛选”菜单上单击“高级筛选/排序”;或在“高级筛选/排序”窗口打开时,在“筛选”菜单上单击“按窗体筛选”。这些操作会在打开的筛选窗口关闭时,导致 ApplyFilter 事件发生,然后,在其他“筛选”窗口打开时,Filter 事件发生。 |
当用户在 Access 项目中执行下列操作时,Filter 事件发生:
? | 在“窗体”视图中的“记录”菜单上,指向“筛选”,然后单击“按窗体筛选”,或在工具栏上单击“按窗体筛选” 。这样将打开“按窗体筛选”窗口,在此窗口中可以创建一个基于窗体中字段的筛选。 |
? | 在“窗体”视图中的“记录”菜单上,指向“筛选”,然后单击工具栏上的“按窗体服务器筛选” 。 这样将打开“按窗体服务器筛选”窗口,在此窗口中可以快速创建基于窗体中字段的服务器筛选。 |
? | 在 Access 项目中“高级筛选/排序”窗口不可用。 |
若要在此事件发生时运行宏或事件过程,请将 OnFilter 属性设置为宏的名称或 [事件过程]。
? | 删除窗体上以前的所有筛选。为此,首先在筛选操作或事件过程中将窗体的 Filter 或 ServerFilter 属性设为一个空字符串 (" ")。如果要确保在新的筛选中不显示无关的条件,此方法非常有用。例如,当使用“按选定内容筛选”功能,使用的条件(在窗体中选取的文本)都将添加到 Filter 或 ServerFilter 属性的 WHERE 子句表达式中,而且会在“按窗体筛选”窗口和“高级筛选/排序”或“按窗体服务器筛选”窗口中显示。通过使用 Filter 事件可删除旧条件。 |
? | 为新筛选输入默认设置,可设置 Filter 或 ServerFilter 属性来包含这些条件。例如,可以使“产品”窗体的全部筛选仅显示当前产品(在“产品”窗体中的“中止”控件没有选定的产品)。 |
? | 使用自定义的筛选窗口而不是 Microsoft Access 的“筛选”窗口。当 Filter 事件发生时,可打开自己的自定义窗体,然后使用此窗体中的项目来设置 Filter 或 ServerFilter 属性以及对以前的窗体进行筛选。当用户关闭此自定义窗体时,将原来窗体的 FilterOn 或 ServerFilterByForm 属性设为 True (-1) 即可应用筛选。取消 Filter 事件可阻止打开 Microsoft Access“筛选”窗口。 |
? | 避免窗体中的特定控件在“按窗体筛选”或“按窗体服务器筛选”窗口中显示或使用。如果在 Filter 宏或事件过程中禁用或隐藏某个控件,则此控件将在“按窗体筛选”或“按窗体服务器筛选”窗口中隐藏或失效,不能用于设置筛选条件。然后,在应用筛选之后,或者从窗体中删除筛选后,便可以使用 ApplyFilter 事件来显示或启用该控件。 |
通过使用 SetValue 操作,可以在 Filter 宏中设置 Filter 或 ServerFilter 属性。这样,您便可以自定义当显示“按窗体筛选”窗口、“高级筛选/排序”窗口或“按窗体服务器筛选”窗口时用户所看到的筛选条件。
可以在 Filter 宏中使用 CancelEvent 操作来取消打开筛选器窗口的操作。
下面的示例显示了如何在用户尝试创建筛选器时禁用“Orders”窗体上的“TotalDue”控件,以便该用户无法对此字段进行筛选。任何具有“TotalDue”值并且满足其他筛选条件的记录都会始终显示在筛选后的窗体上。此示例还强制用户使用“按窗体筛选”窗口而不是“高级筛选/排序”窗口。
若要试用该示例,请在包含“TotalDue”控件的“Orders”窗体中添加下面的事件过程。请通过使用“高级筛选/排序”窗口(该窗口使用“TotalDue”控件)尝试创建筛选器。还要通过使用“按窗体筛选”窗口来尝试创建相同的筛选器。
Private Sub Form_Filter(Cancel As Integer, FilterType As Integer)
If FilterType = acFilterByForm Then
Forms!Orders!TotalDue.Enabled = False
ElseIf FilterType = acFilterAdvanced Then
MsgBox "The best way to filter this form is to use the " _
& "Filter By Form command or toolbar button.", vbOKOnly + vbInformation
Cancel = True
End If
End Sub