数据筛选

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

  1. 在您想要的位置渲染控件(面板、列表、复选框等)——通常在标题下拉菜单中。
  2. 当用户更改选择时,更新您的筛选对象并调用 Apply();处理 OnApply 以调用 Worksheet.DoFilter(range, filter)
  3. 对于标题下拉菜单,从 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>(抽象基类)

成员类型描述
InputSourceIDataSource<T>被筛选的数据源
IsDisabledbool启用或禁用筛选器
Apply()void应用筛选器(触发 OnApply
OnApplyevent筛选器应用时触发
BeginFilter(Worksheet, ColumnBasedDataSource)abstract筛选开始前调用
FilterRecord(T record)abstract bool返回 true 以保留该行
EndFilter()abstract筛选结束后调用

TextSearchDataFilter

筛选包含搜索字符串的行(不区分大小写,搜索所有列)。

属性类型描述
Textstring要搜索的文本
var search = new TextSearchDataFilter();
search.Text = "hello";
search.OnApply += (s, e) => sheet.DoFilter(range, search);
search.Apply();

MultipleDataFilter

组合多个筛选器——行必须通过所有子筛选器才能显示。

属性类型描述
FiltersList<RowBasedDataFilter<IRowDataRecord>>子筛选器列表

更多详情

这篇文章对您有帮助吗?