此主题包含了关于在代码中筛选数据的信息,并由下列小节组成:
关于筛选的总说明,请参阅 筛选概述。
总说明
筛选表达式
通过创建筛选表达式,可以在 GridControl 中筛选数据。 最简单的筛选有下面的形式:“[FieldName] = Value”。 这会选中在指定字段名称的列中有 Value 的记录。
在筛选表达式中,可以根据 FieldName 的类型,使用多种比较运算符。 例如,如果 FieldName 是数值类型或字符串类型,则可以使用这些运算符: >, <, <>。 对于字符串类型的字段,也可以使用“like”运算符来实现部分字符串匹配。 下表包含了可用的比较运算符:比较运算符 | 说明 | 示例 |
---|---|---|
= | 等于。
此运算符可以用于数值、日期-时间、字符串和 Boolean 取值。 |
[ProductID] = 999
|
> | 大于。
此运算符可以用于数值、日期-时间、字符串取值。 |
[ProductName] > 'Uncle'
|
< | 小于。
此运算符可以用于数值、日期-时间、字符串取值。 |
[UnitsInStock] < 100
|
>= | 大于或等于。
此运算符可以用于数值、日期-时间、字符串取值。 |
[BirthDate] >= #01/01/1980#
|
<= | 小于或等于。
此运算符可以用于数值、日期-时间、字符串取值。 |
[CreatedDate] <= #10/2/2006#
|
<> | 不等于。
此运算符可以用于数值、日期-时间、字符串和 Boolean 取值。 |
[Priority] <> 'Low'
|
LIKE | 运算符“LIKE”。
此运算符用于部分字符串匹配。 如果所测试的取值与指定的模式相匹配,则返回 TRUE。 在模式中可以使用“%”和“_”符号作为通配符。 “%”通配符代替任意数目的字符。 “_”通配符用于表示任何单个字符串。 |
[ProductName] LIKE '%Sauce%'
|
NOT LIKE | 运算符“NOT LIKE”。
此运算符用于部分字符串匹配。 如果所测试的取值与指定的模式不匹配,则返回 TRUE。 请参阅 LIKE 运算符的说明来获得更多信息。 |
[IssueSubject] NOT LIKE 'Help:%'
|
IS NULL | 检查所测试的取值是否为 NULL 值。 |
[Region] IS NULL
|
IS NOT NULL | 检查所测试的取值是否不是 NULL 值。 |
[Region] IS NOT NULL
|
字符串常量必须以单引号字符引起。 如果需要把单引号字符作为要筛选的原义字符,则必须使用两个单引号字符。 示例:
[ProductID] LIKE 'Uncle Bob''s%'
日期-时间常量必须以“#”字符括起,并使用不依赖于 culture (固定) 格式来表示。 固定 culture 是基于 English culture,但是某些特殊的 English 格式已经被替换为世界公认的格式。 下面是一些不依赖于 culture 的呈现日期-时间值的格式:
MM/dd/yyyy 07/30/2008dd MMM yyyy 30 JUL 2008
yyyy-MM-dd 2008-07-30
yyyy-MM-ddTHH:mm:ss 2008-07-30T22:59:59
yyyy-MM-dd HH:mm:ssZ 2008-07-30 15:59:59Z
示例:
[CreatedDate] <= #07/30/2008#
要学习更多关于固定 cultures,请参阅 MSDN。
如果在 LIKE 运算符的模式中,“%”、“_”、“[” 或 “]” 字符必须用作原义字符,则使用方括号 (“[]”) 括起来。 示例:
[Note] LIKE '%[_]%'
筛选表达式可以包含由逻辑 AND、AND NOT、OR 和 OR NOT 运算符组合的多个子句。 可以使用圆括号对子句分组。 示例:
[Type] = 'Request' AND NOT ([Status] = 'Fixed' OR [Status] = 'Rejected')
在特定情况下,网格列的编辑值和显示值可能不匹配 (例如,如果列使用了 ImageComboBoxEdit 或 LookUpEdit 内置编辑器,或者以特定的方式对取值设置格式,或者通过 ColumnView.CustomColumnDisplayText 事件提供显示文本)。 在默认情况下,当创建筛选表达式时,列必须与编辑值相比较,而不是显示值。 如果列的编辑值和显示值不匹配,并且需要在筛选表达式中比较列与显示值,则把 GridColumn.FilterMode 属性设置为 DisplayText。
对视图应用筛选
这些属性接受指定筛选表达式的字符串。 把字符串指派到 ViewFilter.NonColumnFilter 不清除任何已应用于个别列的筛选。 ColumnView.ActiveFilterString 属性指定应用于视图和列的全部筛选表达式。 因此把字符串指派到 ColumnView.ActiveFilterString 属性则清除由 ViewFilter.NonColumnFilter 属性指定的筛选、清除所有指派到视图的列的筛选。
下列代码应用了一个筛选,选中在 Category 列中包含取值 3 并且在 Discontinued 列中包含 false 的记录。C# | 复制代码 |
---|---|
gridView1.ActiveFilterString = "[Category] = 3 AND [Discontinued] = false";
|
Visual Basic | 复制代码 |
---|---|
GridView1.ActiveFilterString = "[Category] = 3 AND [Discontinued] = false"
|
如果显示如下:
在本例中,Category 列使用了 ImageComboBoxEdit 内置编辑器,来把下层整数值呈现为附有图像的字符串。 例如,取值 3 通过“Dairy Products”字符串呈现。 在默认情况下,该列必须与编辑值比较。 因此,为了选择包含“Dairy Products”字符串的记录,使用了“Category = 3”筛选。
如果需要创建使用 Category 列显示值的筛选表达式,则把该列的 GridColumn.FilterMode 属性设置为 ColumnFilterMode.DisplayText。 下列代码与上述代码有相同的运行结果:
C# | 复制代码 |
---|---|
gridView1.Columns["Category"].FilterMode = DevExpress.XtraGrid.ColumnFilterMode.DisplayText; gridView1.ActiveFilterString = "[Category] = 'Dairy Products' AND [Discontinued] = false"; |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns["Category"].FilterMode = DevExpress.XtraGrid.ColumnFilterMode.DisplayText GridView1.ActiveFilterString = "[Category] = 'Dairy Products' AND [Discontinued] = false" |
使用 ViewFilter.NonColumnFilter 属性的语法与使用 ColumnView.ActiveFilterString 属性的相同。 下列代码选择 CardView 的 CarCategory 列中有“Saloon”或“Sports”值的记录。
C# | 复制代码 |
---|---|
cardView1.ActiveFilter.NonColumnFilter = "[CarCategory] = 'Saloon' OR [CarCategory] = 'Sports'";
|
Visual Basic | 复制代码 |
---|---|
CardView1.ActiveFilter.NonColumnFilter = "[CarCategory] = 'Saloon' OR [CarCategory] = 'Sports'"
|
对列应用筛选
- 把 ColumnFilterInfo 对象指派到列的 GridColumn.FilterInfo 属性。
-
把一个 {GridColumn, ColumnFilterInfo} 对添加到视图的 ColumnView.ActiveFilter 集合 (使用集合的 ViewFilter.Add 方法)。
ColumnView.ActiveFilter 属性可以用于访问应用于视图的列的所有筛选条件。
注意,ColumnFilterInfo 对象可以表示包含多个列的筛选表达式 (并非只是 ColumnFilterInfo 对象所关联的那个列)。
ColumnFilterInfo 对象的属性是只读的,因此在创建此对象之后就不能改变它的设置。 如果需要修改列的筛选,则新建一个 ColumnFilterInfo 对象,并把它指派到该列。
下面是一些使用 ColumnFilterInfo 构造函数的示例。
示例 —— 通过单个取值进行筛选
ColumnFilterInfo(GridColumn column, object _value)
此构造函数创建一个 “[ColumnFieldName] = _value” 类型的筛选,其中 ColumnFieldName 是 column 的字段名。 注意,类似于其他筛选,此筛选仅在所创建的 ColumnFilterInfo 对象已经指派到任一列之后应用于视图。
ColumnFilterInfo(string filterString, object _value)
如果 filterString 参数设置为一个空字符串,则 _value 参数生效。 在所创建的 ColumnFilterInfo 对象指派到某个特定列之后,“[ColumnFieldName] = _value”筛选被创建并应用于该列。 如果 filterString 参数不是空字符串,则 _value 参数被忽略,并且筛选由 filterString 指定。
ColumnFilterInfo(ColumnFilterType type, object _value, string filterString)
如果 filterString 参数被设置为一个空字符串,并且 type 参数被设置为 ColumnFilterType.Value,则 _value 参数生效。
C# | 复制代码 |
---|---|
object val = "Poland"; GridColumn columnCountry = gridView1.Columns["ShipCountry"]; GridColumn columnCustomer = gridView1.Columns["CustomerID"]; columnCustomer.FilterInfo = new ColumnFilterInfo(columnCountry, val); |
Visual Basic | 复制代码 |
---|---|
Dim val As Object = "Poland" Dim columnCountry As GridColumn= GridView1.Columns("ShipCountry") Dim columnCustomer As GridColumn= GridView1.Columns("CustomerID") columnCustomer.FilterInfo = New ColumnFilterInfo(columnCountry, val) |
也可以通过构建一个执行这种筛选的表达式,根据单个取值来筛选列。 使用 ColumnFilterInfo 的有 string filterString 参数的构造函数。 下列代码与上面的代码等效:
C# | 复制代码 |
---|---|
GridColumn columnCustomer = gridView1.Columns["CustomerID"]; columnCustomer.FilterInfo = new ColumnFilterInfo("[ShipCountry] = 'Poland'"); |
Visual Basic | 复制代码 |
---|---|
Dim columnCustomer As GridColumn = GridView1.Columns("CustomerID") columnCustomer.FilterInfo = New ColumnFilterInfo("[ShipCountry] = 'Poland'") |
当使用有 filterString 参数的构造函数时,可以使用任何比较运算符,并非只是 EQUAL 运算符。
示例 —— 构建复杂的筛选
通过使用 ColumnFilterInfo 的有 string filterString 参数的构造函数,可以应用任何层次的复合筛选:
ColumnFilterInfo(string filterString)
filterString 参数应该指定一个筛选表达式。 另外,只在所创建的 ColumnFilterInfo 对象被指派到任一列之后应用此筛选。
下列代码选择 ShipCountry 字段值被设置为“Norway”或“Sweden”的记录。
C# | 复制代码 |
---|---|
gridView1.Columns["ShipCountry"].FilterInfo = new ColumnFilterInfo( "[ShipCountry]='Norway' OR [ShipCountry]='Sweden'"); |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns("ShipCountry").FilterInfo = New ColumnFilterInfo( _ "[ShipCountry]='Norway' OR [ShipCountry]='Sweden'") |
下列代码选择海运国 (ShipCountry) 名称以“F”起始的记录:
C# | 复制代码 |
---|---|
gridView1.Columns["ShipCountry"].FilterInfo = new ColumnFilterInfo("[ShipCountry] LIKE 'F%'"); |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns("ShipCountry").FilterInfo = New ColumnFilterInfo("[ShipCountry] LIKE 'F%'") |
也可以创建包含多个列的筛选标准。 例如,下列代码选择来自 USA 的 ShippedDate 大于 RequiredDate 的订单:
C# | 复制代码 |
---|---|
gridView1.Columns["RequiredDate"].FilterInfo = new ColumnFilterInfo( "[ShippedDate] > [RequiredDate] AND [ShipCountry] = 'USA'"); |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns("RequiredDate").FilterInfo = New ColumnFilterInfo( _ "[ShippedDate] > [RequiredDate] AND [ShipCountry] = 'USA'") |
在本例中,筛选包含了 ShippedDate、RequiredDate 和 ShipCountry 字段的条件。 此筛选被指派到 RequiredDate 列的 GridColumn.FilterInfo 属性。 那也正是该列的筛选按钮被绘制为“活动”状态的原因。
控制筛选的文本表示形式
从版本 6.2 以上,GridControl 自动生成在 筛选面板 中用于表示筛选的文本。 根据单元格显示值和内置编辑器的设置来生成文本。 当对视图和列应用筛选时,可以重写自动生成的筛选显示文本。
在代码中,当对列应用筛选时,要提供自定义筛选显示文本,则使用 ColumnFilterInfo 类的有“string displayText” 参数的构造函数。 此参数指定在筛选面板中表示该筛选的字符串。
在运行时刻,当通过代码或通过最终用户对列、视图应用筛选时,ColumnView.CustomFilterDisplayText 事件允许提供自定义筛选显示文本。
清除筛选
GridColumn.ClearFilter 方法允许清除特定列的筛选设置。 或者,也可以把一个空 ColumnFilterInfo 对象指派到 GridColumn.FilterInfo 属性:
C# | 复制代码 |
---|---|
gridView1.Columns["RequiredDate"].FilterInfo = new ColumnFilterInfo(); |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns("RequiredDate").FilterInfo = New ColumnFilterInfo() |
把 ViewFilter.NonColumnFilter 属性设置为一个空字符串,来清除应用于视图的筛选表达式 (之前被指派到 ViewFilter.NonColumnFilter 属性),但不影响列的筛选设置。
要清除视图及列的筛选设置,则把 ColumnView.ActiveFilterString 属性设置为一个空字符串,或者调用 ColumnView.ClearColumnsFilter 或 ColumnView.ActiveFilter .Clear 方法。