条件筛选
使用 ConditionalDataFilter 来隐藏值不满足一组列规则的行。筛选器针对附加到工作表范围的 ColumnBasedDataSource 工作,并可与其他行筛选器(例如自由文本搜索)组合使用。
前提条件
- 附加一个命名了要筛选的每列的
ColumnBasedDataSource:
sheet.AddDataSource(range, dataSource);
如果范围没有数据源或数据源不是基于列的,Worksheet.DoFilter 将抛出异常。
FilterCondition.ColumnID 中的列 ID 必须存在于 ColumnBasedDataSource.Columns 中;否则在 BeginFilter 期间会引发 ColumnDefineNotFoundException。
- 筛选通过将行高设置为
0 来隐藏行。任何筛选组合都必须调用 Worksheet.DoFilter(range, filter);。
创建和管理规则
ConditionalDataFilter.Conditions 保存活跃的规则。添加或清除项目,并切换 FilterCondition.IsEnabled 来控制哪些规则运行。
using unvell.ReoGrid;
using unvell.ReoGrid.Data;
using unvell.ReoGrid.Data.ConditionFilter;
var sheet = grid.CurrentWorksheet;
var (ds, range) = BuildColumnDataSource(); // 返回 ColumnBasedDataSource 及其范围
sheet.AddDataSource(range, ds);
var filter = new ConditionalDataFilter
{
ErrorOnMismatchedType = false, // 如果为 true,在数值/类型不匹配时抛出异常
};
filter.Conditions.AddRange(
new FilterCondition("price", ConditionOperator.GreaterThan, 1000),
new FilterCondition("currency", ConditionOperator.Equals, "USD", CellDataKind.Value, ComparisonType.Text),
new FilterCondition("tradeDate", ConditionOperator.Equals, "2024-05") // 月份级别匹配
);
filter.OnApply += (s, e) => sheet.DoFilter(range, filter);
filter.Apply(); // 评估规则并隐藏行
关键规则设置
- 运算符(
ConditionOperator):Equals、NotEquals、StartsWith、EndsWith、Contains、NotContains、GreaterThan、EqualsOrGreaterThan、LessThan、EqualsOrLessThan、Includes(数组成员关系)。
- 列:
ColumnID 必须匹配数据源列名;ColumnIndex 在 BeginFilter 期间自动分配。
- 值解析(
ComparisonType):默认 Auto 尝试 数值 → 日期时间 → 文本。
- 数值解析接受数字、字符串、
StringBuilder 和百分比(如 "100%",范围 0.0–1.0)。
- 日期时间解析接受
DateTime 值和多种字符串格式(yyyy/MM/dd、yyyyMMdd、yyyy-M、yyyy年M月d日、h:m[:s],以及通用 DateTime.TryParse)。
- 日期的等值比较遵循从格式推断的
DateTimeValidPart(例如 YYYY、YYYYMM、YYYYMMDD、HHMM、HHMMSS)。
- 比较目标(
ComparisonDataKind):使用 CellDataKind.Value(默认)比较原始值,或使用 CellDataKind.DisplayText 比较格式化文本。示例 UI 在匹配渲染的字符串时将日期列切换为 DisplayText。
- 数组规则:
ConditionOperator.Includes 接受任何 IEnumerable;设置 ComparisonType.Numeric 以要求数值成员。
- 空值处理:在等值检查中,空字符串和
null 被视为相等。
单独或组合应用筛选器
当规则变更时调用 Worksheet.DoFilter(range, filter)。一种典型的模式是从筛选器的 OnApply 事件中运行它,这样 UI 变更就会触发重新应用。要与其他筛选器(例如 TextSearchDataFilter)组合,请将它们包装在 MultipleDataFilter 中:
var condition = new ConditionalDataFilter();
var search = new TextSearchDataFilter();
var filters = new MultipleDataFilter();
filters.Filters.Add(condition);
filters.Filters.Add(search);
condition.OnApply += (s, e) => sheet.DoFilter(range, filters);
search.OnApply += (s, e) => sheet.DoFilter(range, filters);
当您更改条件(添加/删除、更新值、切换 IsEnabled)时,调用 Apply() 以触发 OnApply 并重新运行 DoFilter。
API 参考
ConditionalDataFilter
| 成员 | 类型 | 描述 |
|---|
Conditions | ConditionCollection | 筛选规则集合 |
ErrorOnMismatchedType | bool | 如果为 true,在比较期间类型不匹配时抛出异常 |
Apply() | void | 评估规则(触发 OnApply) |
OnApply | event | 处理以调用 DoFilter |
ConditionCollection
| 方法 | 描述 |
|---|
Add(FilterCondition item) | 添加规则 |
AddRange(params FilterCondition[] items) | 添加多个规则 |
Remove(FilterCondition item) | 移除规则 |
Clear() | 移除所有规则 |
Contains(FilterCondition item) | 检查规则是否存在 |
Count | 规则数量 |
FilterCondition
| 构造函数参数 | 类型 | 默认值 | 描述 |
|---|
columnId | string | 必填 | 数据源中的列 ID |
op | ConditionOperator | 必填 | 比较运算符 |
value | object | 必填 | 要比较的值 |
comparisonDataKind | CellDataKind | Value | 比较原始值还是显示文本 |
comparisonType | ComparisonType | Auto | 如何解析值 |
| 属性 | 类型 | 描述 |
|---|
ColumnID | string | 列标识符 |
Operator | ConditionOperator | 比较运算符 |
Value | object | 比较值 |
IsEnabled | bool | 此规则是否激活 |
ComparisonDataKind | CellDataKind | 与原始值还是显示文本比较 |
ConditionOperator 枚举
| 值 | 符号 | 描述 |
|---|
Equals | == | 等于 |
NotEquals | != | 不等于 |
StartsWith | ~* | 以…开头 |
EndsWith | *~ | 以…结尾 |
Contains | ~ | 包含 |
NotContains | !~ | 不包含 |
GreaterThan | > | 大于 |
EqualsOrGreaterThan | >= | 大于或等于 |
LessThan | < | 小于 |
EqualsOrLessThan | <= | 小于或等于 |
Includes | IN | 值在集合中 |
ComparisonType 枚举
| 值 | 描述 |
|---|
Auto | 自动检测类型(数值 → 日期时间 → 文本) |
Numeric | 强制数值比较 |
Text | 强制文本比较 |
DateTime | 强制日期时间比较 |
CellDataKind 枚举
| 值 | 描述 |
|---|
Value | 与原始单元格值比较 |
DisplayText | 与格式化的显示文本比较 |
DateTimeValidPart 枚举
控制日期比较的粒度(从值格式自动推断):
| 值 | 描述 |
|---|
YYYYMMDD_HHMMSS | 完整日期和时间 |
YYYY | 仅年份 |
YYYYMM | 年和月 |
YYYYMMDD | 年、月和日 |
HH | 仅小时 |
HHMM | 小时和分钟 |
HHMMSS | 小时、分钟和秒 |
YYYYMMDD_HHMM | 日期和时间(不含秒) |
相关主题