条件筛选

使用 ConditionalDataFilter 来隐藏值不满足一组列规则的行。筛选器针对附加到工作表范围的 ColumnBasedDataSource 工作,并可与其他行筛选器(例如自由文本搜索)组合使用。

前提条件

  • 附加一个命名了要筛选的每列的 ColumnBasedDataSourcesheet.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):EqualsNotEqualsStartsWithEndsWithContainsNotContainsGreaterThanEqualsOrGreaterThanLessThanEqualsOrLessThanIncludes(数组成员关系)。
  • ColumnID 必须匹配数据源列名;ColumnIndexBeginFilter 期间自动分配。
  • 值解析ComparisonType):默认 Auto 尝试 数值 → 日期时间 → 文本。
    • 数值解析接受数字、字符串、StringBuilder 和百分比(如 "100%",范围 0.0–1.0)。
    • 日期时间解析接受 DateTime 值和多种字符串格式(yyyy/MM/ddyyyyMMddyyyy-Myyyy年M月d日h:m[:s],以及通用 DateTime.TryParse)。
    • 日期的等值比较遵循从格式推断的 DateTimeValidPart(例如 YYYYYYYYMMYYYYMMDDHHMMHHMMSS)。
  • 比较目标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

成员类型描述
ConditionsConditionCollection筛选规则集合
ErrorOnMismatchedTypebool如果为 true,在比较期间类型不匹配时抛出异常
Apply()void评估规则(触发 OnApply
OnApplyevent处理以调用 DoFilter

ConditionCollection

方法描述
Add(FilterCondition item)添加规则
AddRange(params FilterCondition[] items)添加多个规则
Remove(FilterCondition item)移除规则
Clear()移除所有规则
Contains(FilterCondition item)检查规则是否存在
Count规则数量

FilterCondition

构造函数参数类型默认值描述
columnIdstring必填数据源中的列 ID
opConditionOperator必填比较运算符
valueobject必填要比较的值
comparisonDataKindCellDataKindValue比较原始值还是显示文本
comparisonTypeComparisonTypeAuto如何解析值
属性类型描述
ColumnIDstring列标识符
OperatorConditionOperator比较运算符
Valueobject比较值
IsEnabledbool此规则是否激活
ComparisonDataKindCellDataKind与原始值还是显示文本比较

ConditionOperator 枚举

符号描述
Equals==等于
NotEquals!=不等于
StartsWith~*以…开头
EndsWith*~以…结尾
Contains~包含
NotContains!~不包含
GreaterThan>大于
EqualsOrGreaterThan>=大于或等于
LessThan<小于
EqualsOrLessThan<=小于或等于
IncludesIN值在集合中

ComparisonType 枚举

描述
Auto自动检测类型(数值 → 日期时间 → 文本)
Numeric强制数值比较
Text强制文本比较
DateTime强制日期时间比较

CellDataKind 枚举

描述
Value与原始单元格值比较
DisplayText与格式化的显示文本比较

DateTimeValidPart 枚举

控制日期比较的粒度(从值格式自动推断):

描述
YYYYMMDD_HHMMSS完整日期和时间
YYYY仅年份
YYYYMM年和月
YYYYMMDD年、月和日
HH仅小时
HHMM小时和分钟
HHMMSS小时、分钟和秒
YYYYMMDD_HHMM日期和时间(不含秒)

相关主题

这篇文章对您有帮助吗?