筛选下拉列表提供了对列应用筛选标准的一组选项。 此主题包含了与筛选下拉列表相关的设置,并展示了如何定制该列表。 关于数据筛选的总说明,请参阅 筛选概述 文档。
筛选下拉列表
列的筛选下拉列表提供了运行时刻的筛选功能。 筛选下拉列表显示了表示列的唯一值的项。 要对特定的列筛选数据,最终用户可以调用列的筛选下拉列表,并选择任何列表项。 这样会自动筛选数据 (显示那些在当前列中有选中取值的记录)。 除了列的取值之外,常规的筛选下拉列表还显示 MRU 项 (最近使用项) 和预定义项 (All)、(Custom)、(Blanks) 和 (Non Blanks),这些项提供了额外的功能 (请参阅下面)。
对于网格视图及其子类,可以通过单击列标头中的 筛选按钮 来调用筛选下拉列表。 对于卡片视图,单击 “Customization(自定义)”按钮 调用可用的列 (字段) 的一个列表。 然后可以单击任何列的 Filter 按钮,来打开它的筛选下拉列表:
筛选下拉列表可以被呈现为 常规的列表(regular list) 或 复选式列表(checked list)。 对于日期-时间列,在默认情况下筛选下拉列表显示一个 日历,允许最终用户快速选取一个日期或日期范围。 另外,此筛选下拉列表在日历下面显示了复选框,用来选择公共的日期间隔:
在默认情况下,日期/时间列的筛选下拉列表嵌入了一个日历,其中含有用于选择公共日期间隔的复选框。 对于其他列,筛选下拉列表被呈现为一个常规列表。 要为列显式指定筛选下拉列表的类型,则使用 OptionsColumnFilter.FilterPopupMode 属性。 下表总结了在筛选下拉列表类型之间的区别:
功能 | 常规筛选下拉列表 | 复选式筛选下拉列表 | 内嵌日历(对日期/时间列) |
---|---|---|---|
选择列表项 | 一次可以选择一个列表项 | 可以同时选择多个列表项 | 最终用户可以通过日历选择日期或日期范围。 另外,允许通过复选框选择公共日期范围。 |
清除当前筛选 | 单击 (All) 列表项 | 单击 (Show All) 列表项 | 单击 Show All 列表项 |
支持 MRU 列表项 | 是 | 否 | 否 |
支持 (Custom) 列表项 (用于调用 自定义筛选对话框) | 是 | 否 | 否 |
支持 (Blanks) 和 (Non Blanks) 列表项 (用于选择当前列中包含 null 和非 null 值的记录) | 是 | 否 | 是 |
可视列表项的数目 | ColumnViewOptionsFilter.ColumnFilterPopupRowCount | - | - |
列表项的总数 | 受限于 ColumnViewOptionsFilter.ColumnFilterPopupMaxRecordsCount 属性。 | 受限于 ColumnViewOptionsFilter.ColumnFilterPopupMaxRecordsCount 和 ColumnViewOptionsFilter.MaxCheckedListItemCount 属性。 | - |
通过事件定制下拉列表 | ColumnView.ShowFilterPopupListBox 事件。 | ColumnView.ShowFilterPopupCheckedListBox 事件。 | ColumnView.ShowFilterPopupDate 事件。 |
支持添加自定义列表项 | 是 | 否 | 可以添加呈现自定义筛选标准的复选框。 |
支持删除已有列表项 | 是 | 是 | 可以删除现有的复选框。 |
支持禁用现有列表项 | 否 | 是 | 否 |
在默认情况下,筛选下拉列表只显示记录中与当前筛选标准相符的唯一值。 如果需要显示所有记录 (即使来源于不符合当前筛选标准的记录) 的列取值,则在单击筛选按钮的同时按下 SHIFT 键。
常规的筛选下拉列表
除了唯一的列取值之外,常规筛选下拉列表还可以显示 MRU (最近使用) 项和预定义项 ((All)、(Custom)、(Blanks) 和 (Non Blanks))。 另外,通过接管 ColumnView.ShowFilterPopupListBox 事件,可以把自定义项添加到列表中,或者删除现有项。 此事件的 e.ComboBox.Items 参数提供了对列表项集合的访问。 下表描述了所支持的列表项,如果需要通过事件定制筛选下拉列表,则这可能是有用的。
列表项 | 说明 | 表示列表项的对象 |
---|---|---|
MRU (最近使用) 筛选项 | 选中此项,则对列应用相应的筛选。 MRU 筛选是从 GridColumn.MRUFilters 集合中获取的。 当对列应用筛选时,筛选被自动添加到此集合中。 但是,在筛选下拉列表的 MRU 筛选项中不显示当前应用的筛选。 要获得关于影响 MRU 筛选的设置的信息,请参阅 筛选概述 主题。 |
这些项由 FilterItem 对象表示。 列表项的 FilterItem.Value 属性引用了 ColumnFilterInfo 对象。 当选中该项时,通过 FilterItem.Value 指定的筛选标准被“原样”应用于数据源。 |
双分隔线 | 分隔 MRU 筛选项和预定义项。 | 此项通过一个 System.String 对象在列表中呈现,并且其取值等于“-”。 |
(All) | 取消当前列的任何筛选。 | 此项由 FilterItem 对象表示。 此项的 FilterItem.Value 属性引用另一个 FilterItem 对象。 后者的 Value 属性包含 0。 |
(Custom) | 打开 自定义筛选对话框,允许最终用户使用多种筛选运算符 (>、>=、LIKE 等) 为列创建筛选标准。 也可以创建由两个筛选条件组成的筛选标准。 | 此项由 FilterItem 对象表示。 此项的 FilterItem.Value 属性引用另一个 FilterItem 对象。 后者的 Value 属性包含 1。 |
(Blanks) | 显示在当前列中包含 DBNull 值的记录。 此项应用一种筛选条件类型:“ColumnFieldName Is Null”。 | 此项由 FilterItem 对象表示。 此项的 FilterItem.Value 属性引用另一个 FilterItem 对象。 后者的 Value 属性包含 2。 |
(Non Blanks) | 显示在当前列中不包含 DBNull 值的记录。 此项应用一种筛选条件类型:“ColumnFieldName Is Not Null”。 | 此项由 FilterItem 对象表示。 此项的 FilterItem.Value 属性引用另一个 FilterItem。 后者的 Value 属性包含 3。 |
取值项 | 这些项表示从数据源中取回的唯一列值。 选中一个项则创建并应用“ColumnFieldName = Value”筛选条件。 “Value”是选中项所表示的取值。 | 这些项由 FilterItem 对象表示。 每个项的 FilterItem.Value 属性引用除去 FilterItem 和 ColumnFilterInfo 之外的任何对象。 当选择一个项时,该取值被用于创建 “ColumnFieldName = Value” 类型的筛选条件。 |
自定义项 | 这些项引用 ColumnFilterInfo 对象,并定义当选中项时所应用的筛选标准。
自定义项只能通过 ColumnView.ShowFilterPopupListBox 事件人工添加到列表中。 通常,创建自定义项来表示复杂的筛选标准,或含有“等于”之外的运算符的筛选条件。 例如,对于日期列,可以创建一个 THIS MONTH 自定义筛选项。 选中此项,将应用选择本月内日期的筛选标准。 如果某个列显示了地名,则可以实现“THE GREAT 8”或“EURO ZONE”自定义项,等等。 |
这些项必须由 FilterItem 对象表示。 每个项的 FilterItem.Value 属性必须引用指定了筛选标准的 ColumnFilterInfo 对象。 当该项被选中时,这些筛选标准将被“原样”应用于数据源。 |
示例: 添加取值项
下列代码展示了如何移除 常规筛选下拉列表 中的除去预定义项以外的其他所有项,然后把一个新的取值项 (“VIP Client”) 添加到 CustomerID 列。 假设该列的 MRU 筛选项被禁用 (ColumnViewOptionsFilter.AllowColumnMRUFilterList 属性值被设置为 false):
选择该项,把 ("[CustomerID] = 'DUMON'") 筛选应用于绑定数据源:
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; // ... gridView1.OptionsFilter.AllowColumnMRUFilterList = false; // ... private void gridView1_ShowFilterPopupListBox(object sender, FilterPopupListBoxEventArgs e) { if(e.Column != gridView1.Columns["CustomerID"]) return; // New item value and display text. string itemDisplayText = "VIP Client"; string itemValue = "DUMON"; // Prevent excessive item updates. e.ComboBox.BeginUpdate(); try { // Delete values items. while(e.ComboBox.Items.Count > 4) e.ComboBox.Items.RemoveAt(e.ComboBox.Items.Count - 1); // Add a new item. e.ComboBox.Items.Add(new FilterItem(itemDisplayText, itemValue)); } finally { e.ComboBox.EndUpdate(); } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid ' ... GridView1.OptionsFilter.AllowColumnMRUFilterList = False ' ... Private Sub GridView1_ShowFilterPopupListBox(ByVal sender As Object, _ ByVal e As FilterPopupListBoxEventArgs) _ Handles GridView1.ShowFilterPopupListBox If Not e.Column Is GridView1.Columns("CustomerID") Then Return ' New item value and display text. Dim itemDisplayText As String = "VIP Client" Dim itemValue As String = "DUMON" ' Prevent excessive item updates. e.ComboBox.BeginUpdate() Try ' Delete values items. While (e.ComboBox.Items.Count > 4) e.ComboBox.Items.RemoveAt(e.ComboBox.Items.Count - 1) End While ' Add a new item. e.ComboBox.Items.Add(New FilterItem(itemDisplayText, itemValue)) Finally e.ComboBox.EndUpdate() End Try End Sub |
示例: 添加自定义项
下列示例举例说明了如何使用 ColumnView.ShowFilterPopupListBox 事件来把两个自定义项 ("TODAY" 和 "THIS MONTH") 添加到 OrderDate 列的 常规筛选下拉列表。
当最终用户选择 TODAY 项时,一个适当的筛选被应用于该列,并且选择 OrderDate 字段包含日期介于今日 12:00 AM 和 11:59 PM 间的所有记录。 与此类似,THIS MONTH 筛选项选择引用当前月份的记录。
下一幅插图展示了在选中 THIS MONTH 筛选项之后的网格视图:通过自定义的 getFilterString 方法,TODAY 和 THIS MONTH 项的筛选字符串被创建。 在 筛选面板 中这些项的显示文本是通过自定义的 getFilterDisplayText 方法取回的。
要获得关于创建表示特定筛选标准的 ColumnFilterInfo 对象的信息,请参阅 通过代码筛选 主题。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Grid; // Represents custom filter item types. public enum ItemTypeEnum {itToday, itThisMonth}; private void gridView1_ShowFilterPopupListBox(object sender, FilterPopupListBoxEventArgs e) { if (e.Column.FieldName == "OrderDate") { // Get the index of the first value item. int index; for(index = 0; index < e.ComboBox.Items.Count; index++) { object item = e.ComboBox.Items[index]; if(item is FilterItem) { object itemValue = ((FilterItem)item).Value; if(itemValue is FilterItem || itemValue is ColumnFilterInfo) continue; break; } } // Create filter criteria to select the records which refer to the current date. ColumnFilterInfo fInfo = new ColumnFilterInfo(getFilterString(e.Column.FieldName, ItemTypeEnum.itToday), getFilterDisplayText(e.Column.Caption, ItemTypeEnum.itToday)); // Add the custom TODAY filter item. e.ComboBox.Items.Insert(index, new FilterItem("TODAY", fInfo)); // Create filter criteria to select the records which refer to the current month. fInfo = new ColumnFilterInfo(getFilterString(e.Column.FieldName, ItemTypeEnum.itThisMonth), _ getFilterDisplayText(e.Column.Caption, ItemTypeEnum.itThisMonth)); // Add the custom THIS MONTH filter item. e.ComboBox.Items.Insert(index + 1, new FilterItem("THIS MONTH", fInfo)); } } // Returns a filter expression for a custom filter item. protected virtual string getFilterString(string columnName, ItemTypeEnum itemType) { string filter = ""; DateTime date1, date2; string date1Str, date2Str; switch (itemType) { // The filter expression for the TODAY item. case ItemTypeEnum.itToday: date1 = DateTime.Today; date2 = date1.AddDays(1); date1Str = "#" + date1.ToString("g") + "#"; date2Str = "#" + date2.ToString("g") + "#"; filter = "([" + columnName + "] >= " + date1Str + " AND [" + columnName + "] < " + date2Str + ")"; break; // The filter expression for the THIS MONTH item. case ItemTypeEnum.itThisMonth: date1 = DateTime.Today.AddDays(1 - DateTime.Today.Day); date2 = date1.AddMonths(1); date1Str = "#" + date1.ToString("g") + "#"; date2Str = "#" + date2.ToString("g") + "#"; filter = "([" + columnName + "] >= " + date1Str + " AND [" + columnName + "] < " + date2Str + ")"; break; } return filter; } // Returns the filter display text for a custom filter item. protected virtual string getFilterDisplayText(string columnName, ItemTypeEnum itemType) { string displayText=""; switch (itemType) { case ItemTypeEnum.itToday: displayText = columnName + " = TODAY"; break; case ItemTypeEnum.itThisMonth: displayText = columnName + " = THIS MONTH"; break; } return displayText; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.Grid ' Represents custom filter item types. Public Enum ItemTypeEnum itToday itThisMonth End Enum Private Sub GridView1_ShowFilterPopupListBox(ByVal sender As System.Object, _ ByVal e As FilterPopupListBoxEventArgs) _ Handles GridView1.ShowFilterPopupListBox If e.Column.FieldName = "OrderDate" Then ' Get the index of the first value item. Dim index As Integer For index = 0 To e.ComboBox.Items.Count - 1 Dim item As Object = e.ComboBox.Items(index) If TypeOf item Is FilterItem Then Dim itemValue As Object = item.Value If (Not TypeOf itemValue Is FilterItem) And _ (Not TypeOf itemValue Is ColumnFilterInfo) Then Exit For End If Next ' Create filter criteria to select the records which refer to the current date. Dim fInfo As ColumnFilterInfo = New ColumnFilterInfo( _ getFilterString(e.Column.FieldName, ItemTypeEnum.itToday), _ getFilterDisplayText(e.Column.Caption, ItemTypeEnum.itToday)) ' Add the custom TODAY filter item. e.ComboBox.Items.Insert(index, New FilterItem("TODAY", fInfo)) ' Create filter criteria to select the records which refer to the current month. fInfo = New ColumnFilterInfo( _ getFilterString(e.Column.FieldName, ItemTypeEnum.itThisMonth), _ getFilterDisplayText(e.Column.Caption, ItemTypeEnum.itThisMonth)) ' Add the custom THIS MONTH filter item. e.ComboBox.Items.Insert(index + 1, New FilterItem("THIS MONTH", fInfo)) End If End Sub ' Returns a filter expression for a custom filter item. Protected Overridable Function getFilterString(ByVal columnName As String, _ ByVal itemType As ItemTypeEnum) As String Dim filter As String = "" Dim date1, date2 As DateTime Dim date1Str, date2Str As String Select Case itemType Case ItemTypeEnum.itToday ' The filter expression for the TODAY item. date1 = DateTime.Today date2 = date1.AddDays(1) date1Str = "#" + date1.ToString("g") + "#" date2Str = "#" + date2.ToString("g") + "#" filter = "([" + columnName + "] >= " + date1Str + " AND [" + columnName + "] < " _ + date2Str + ")" Exit Select Case ItemTypeEnum.itThisMonth ' The filter expression for the THIS MONTH item. date1 = DateTime.Today.AddDays(1 - DateTime.Today.Day) date2 = date1.AddMonths(1) date1Str = "#" + date1.ToString("g") + "#" date2Str = "#" + date2.ToString("g") + "#" filter = "([" + columnName + "] >= " + date1Str + " AND [" + columnName + "] < " _ + date2Str + ")" Exit Select End Select Return filter End Function ' Returns the filter display text for a custom filter item. Protected Overridable Function getFilterDisplayText(ByVal columnName As String, _ ByVal itemType As ItemTypeEnum) As String Dim displayText As String = "" Select Case itemType Case ItemTypeEnum.itToday displayText = columnName + " = TODAY" Exit Select Case ItemTypeEnum.itThisMonth displayText = columnName + " = THIS MONTH" Exit Select End Select Return displayText End Function |
复选式筛选下拉列表
复选式筛选下拉列表显示唯一取值,以及在顶部的“Show All”项。 所有项的左边都有复选框,允许最终用户同时选择多个项。 通过接管 ColumnView.ShowFilterPopupCheckedListBox 事件,可以定制复选式筛选下拉列表,并且删除或禁用特定的项。 不支持添加自定义项。
当接管 ColumnView.ShowFilterPopupCheckedListBox 事件时,通过事件的 CheckedComboBox.Items 参数可以访问和修改列表项集合。 此集合中的每个项都引用一个唯一的列取值,并且由 FilterItem 对象表示。 FilterItem.Value 属性引用实际的取值。
“Show All”项不出现在 CheckedComboBox.Items 集合中。 要隐藏“Show All”项,则把 CheckedComboBox.ShowAllItemVisible 属性设置为 false。
示例: 定制复选式筛选下拉列表
下面的示例展示了如何通过 ColumnView.ShowFilterPopupCheckedListBox 事件来定制 复选式筛选下拉列表。 在本示例中,Category Name 列的筛选下拉列表被呈现为一个复选式列表。 在 ShowFilterPopupCheckedListBox 事件中,此列表的“Show All”项被隐藏,并且禁用了两个项 (“Seafood” 和 “Condiments”)。 结果如下图所示:
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraEditors.Controls; // Enable the checked filter dropdown list for the Category Name column. colCategoryName.OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.CheckedList; // Subscribe to the ShowFilterPopupCheckedListBox event. gridView1.ShowFilterPopupCheckedListBox += new FilterPopupCheckedListBoxEventHandler(gridView1_ShowFilterPopupCheckedListBox); void gridView1_ShowFilterPopupCheckedListBox(object sender, DevExpress.XtraGrid.Views.Grid.FilterPopupCheckedListBoxEventArgs e) { if(e.Column.FieldName != "CategoryName") return; // Hide the "Show All" item. e.CheckedComboBox.ShowAllItemVisible = false; // Locate and disable checked items that contain specific values. for(int i =0; i< e.CheckedComboBox.Items.Count; i++) { CheckedListBoxItem item = e.CheckedComboBox.Items[i]; string itemValue = (string)(item.Value as FilterItem).Value; if (itemValue == "Seafood" || itemValue == "Condiments") { e.CheckedComboBox.Items[i].Enabled = false; } } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraEditors.Controls ' Enable the checked filter dropdown list for the Category Name column. colCategoryName.OptionsFilter.FilterPopupMode = _ DevExpress.XtraGrid.Columns.FilterPopupMode.CheckedList ' Subscribe to the ShowFilterPopupCheckedListBox event. AddHandler GridView1.ShowFilterPopupCheckedListBox, _ AddressOf gridView1_ShowFilterPopupCheckedListBox Private Sub gridView1_ShowFilterPopupCheckedListBox(ByVal sender As Object, _ ByVal e As FilterPopupCheckedListBoxEventArgs) If e.Column.FieldName <> "CategoryName" Then Return End If ' Hide the "Show All" item. e.CheckedComboBox.ShowAllItemVisible = False ' Locate and disable checked items that contain specific values. Dim i As Integer = 0 Do While i < e.CheckedComboBox.Items.Count Dim item As CheckedListBoxItem = e.CheckedComboBox.Items(i) Dim itemValue As String = CStr((TryCast(item.Value, FilterItem)).Value) If itemValue = "Seafood" OrElse itemValue = "Condiments" Then e.CheckedComboBox.Items(i).Enabled = False End If i += 1 Loop End Sub |