数据筛选
ReoGrid 通过对数据范围运行筛选器来隐藏行。您可以使用内置的列筛选 UI、基于规则的条件筛选,或者将自定义筛选逻辑连接到任何您喜欢的 GUI。
筛选入口
- 自动筛选 UI — Excel 风格的下拉菜单,收集每列的唯一值。参见内置自动筛选。
- 条件筛选 — 规则对象(
ConditionalDataFilter + FilterCondition),针对 ColumnBasedDataSource 进行评估。参见条件筛选。
- 自定义筛选 — 实现
RowBasedDataFilter<IRowDataRecord>(或使用 Func<int, bool>),然后自行调用 Worksheet.DoFilter(range, filter)。
最简示例
使用谓词
var sheet = grid.CurrentWorksheet;
var range = sheet.UsedRange;
sheet.DoFilter(range, rowIndex =>
{
var value = sheet[rowIndex, 2]; // 第三列
return value is double d && d >= 1000; // 保留值 >= 1000 的行
});
使用数据筛选器
var condition = new ConditionalDataFilter();
condition.Conditions.Add(new FilterCondition("price", ConditionOperator.GreaterThan, 1000));
condition.OnApply += (s, e) => sheet.DoFilter("A1:D200", condition);
condition.Apply(); // 触发 DoFilter
组合筛选器
当您希望多个筛选器同时生效时(例如,条件规则加上自由文本搜索),可以使用 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("A1:F300", filters);
search.OnApply += (s, e) => sheet.DoFilter("A1:F300", filters);
屏幕筛选与数据驱动筛选
- 屏幕筛选(UI 驱动):内置自动筛选和条件筛选隐藏工作表上已存在的行。它们作用于当前加载在工作表中的范围。
- 数据驱动筛选:如果您的数据源支持筛选/查询,请先在数据源端进行筛选(例如数据库查询、内存中的 LINQ),然后将筛选后的
ColumnBasedDataSource 绑定到工作表。ReoGrid 将仅显示筛选后的记录,任何附加的屏幕筛选将在此基础上再次应用。
构建自定义筛选 UI
- 在您想要的位置渲染控件(面板、列表、复选框等)——通常在标题下拉菜单中。
- 当用户更改选择时,更新您的筛选对象并调用
Apply();处理 OnApply 以调用 Worksheet.DoFilter(range, filter)。
- 对于标题下拉菜单,从
DropdownHeaderCell 派生并将您的控件作为下拉内容附加,然后在列标题上安装标题主体。
工作表筛选方法
CreateColumnFilter 重载
| 签名 | 描述 |
|---|
CreateColumnFilter() | 自动检测使用范围并创建筛选器 |
CreateColumnFilter(RangePosition range, AutoColumnFilterUI ui) | 在指定范围上创建筛选器 |
CreateColumnFilter(string startCol, string endCol, int titleRows, AutoColumnFilterUI ui) | 按列代码创建 |
CreateColumnFilter(int column, int titleRows, AutoColumnFilterUI ui) | 在单列上创建 |
CreateColumnFilter(int startCol, int endCol, int titleRows, AutoColumnFilterUI ui) | 按列索引创建 |
DoFilter 重载
| 签名 | 描述 |
|---|
DoFilter(RangePosition range, Func<int, bool> filter) | 使用谓词筛选(行索引 → 是否保留?) |
DoFilter(string addressOrRange, RowBasedDataFilter<IRowDataRecord> filter) | 按地址使用数据筛选器筛选 |
DoFilter(RangePosition range, RowBasedDataFilter<IRowDataRecord> filter) | 按范围使用数据筛选器筛选 |
SortColumn
| 签名 | 描述 |
|---|
SortColumn(string columnCode, SortOrder order) | 按列地址代码排序 |
SortColumn(int columnIndex, RangePosition applyRange, SortOrder order) | 在指定范围内排序 |
SortOrder 枚举
| 值 | 描述 |
|---|
Ascending | 升序排列 A→Z / 从小到大 |
Descending | 降序排列 Z→A / 从大到小 |
事件
| 事件 | 描述 |
|---|
RowsFiltered | 在工作表上筛选行后触发 |
sheet.RowsFiltered += (s, e) =>
{
Console.WriteLine("Rows have been filtered");
};
筛选器类
RowBasedDataFilter<T>(抽象基类)
| 成员 | 类型 | 描述 |
|---|
InputSource | IDataSource<T> | 被筛选的数据源 |
IsDisabled | bool | 启用或禁用筛选器 |
Apply() | void | 应用筛选器(触发 OnApply) |
OnApply | event | 筛选器应用时触发 |
BeginFilter(Worksheet, ColumnBasedDataSource) | abstract | 筛选开始前调用 |
FilterRecord(T record) | abstract bool | 返回 true 以保留该行 |
EndFilter() | abstract | 筛选结束后调用 |
TextSearchDataFilter
筛选包含搜索字符串的行(不区分大小写,搜索所有列)。
var search = new TextSearchDataFilter();
search.Text = "hello";
search.OnApply += (s, e) => sheet.DoFilter(range, search);
search.Apply();
MultipleDataFilter
组合多个筛选器——行必须通过所有子筛选器才能显示。
| 属性 | 类型 | 描述 |
|---|
Filters | List<RowBasedDataFilter<IRowDataRecord>> | 子筛选器列表 |
更多详情