ReoGrid 包含类似 Excel 的列筛选功能。它为每列构建一个下拉菜单,收集该列的唯一值,并允许用户显示/隐藏行或对数据排序。
创建列筛选
使用 Worksheet.CreateColumnFilter 将内置 UI 附加到一个或多个列。筛选器扫描您提供的范围(不包括标题行)以构建候选列表。
// 在工作表上放置数据
worksheet["C1:C5"] = new object[] { "A", "B", "C", "D", "E" };
// 在 C 列上创建筛选器,无标题行
var filter = worksheet.CreateColumnFilter("C", "C", titleRows: 0);
常用重载:
CreateColumnFilter()— 覆盖当前使用范围。CreateColumnFilter(string startColumn, string endColumn, int titleRows = 0, AutoColumnFilterUI ui = AutoColumnFilterUI.DropdownButtonAndPanel)CreateColumnFilter(RangePosition range, AutoColumnFilterUI ui = AutoColumnFilterUI.DropdownButtonAndPanel)
默认情况下,每个列标题上会添加一个下拉按钮:
点击它可以看到候选列表(从 DisplayText 收集):
要创建不带 UI 的筛选器,请传入 AutoColumnFilterUI.NoGUI:
var filter = worksheet.CreateColumnFilter("C", "C", 0, AutoColumnFilterUI.NoGUI);
使用 NoGUI 时,您完全通过代码控制候选项——添加或删除每列的 SelectedTextItems,并在条件变更时调用 Apply()。
WPF:自定义模板
使用 WPF 构建时,您可以通过 DataTemplate 来自定义内置 UI 的样式:
AutoColumnFilter.FilterButtonTemplate— 显示在列标题上的下拉按钮的模板(传播到每个AutoColumnFilterBody.DropdownButtonTemplate)。AutoColumnFilter.FilterPopupItemTemplate— 筛选弹出列表中每个项目的模板(默认为复选框 + 文本)。绑定到ColumnFilterPopupItem的属性,如Text和IsChecked。DropdownHeaderCell.DropdownButtonTemplate(在特定列筛选主体上)— 如果需要每列使用不同按钮的逐列覆盖。
示例:
<DataTemplate x:Key="FilterButtonTemplate">
<Grid Width="16" Height="16">
<Path Data="M0,0 L8,8 L16,0 Z" Fill="DarkSlateGray"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="FilterItemTemplate">
<StackPanel Orientation="Horizontal" Margin="4,2">
<CheckBox IsChecked="{Binding IsChecked}" />
<TextBlock Text="{Binding Text}" Margin="6,0,0,0"/>
</StackPanel>
</DataTemplate>
var filter = worksheet.CreateColumnFilter("C", "E");
filter.FilterButtonTemplate = (DataTemplate)FindResource("FilterButtonTemplate");
filter.FilterPopupItemTemplate = (DataTemplate)FindResource("FilterItemTemplate");
编程式筛选
您可以通过代码控制哪些项目被选中:
filter.Columns["C"].SelectedTextItems.Clear();
filter.Columns["C"].SelectedTextItems.AddRange(new[] { "A", "C", "D" });
filter.Apply();
排序
使用 Worksheet.SortColumn 对列进行排序。排序会同步移动应用范围内的其他列。
// 对 C 列排序
worksheet.SortColumn("C", order: SortOrder.Descending);
您还可以限制排序允许移动的区域:
worksheet.SortColumn(
columnIndex: 1, // B 列(从零开始)
applyRange: new RangePosition("A1:B5"),
order: SortOrder.Descending);
结果:

在 ReoGrid 编辑器中创建筛选
在编辑器应用中,选择数据范围(不包括标题行),然后选择 Sheet → Filter 以添加下拉按钮。示例设置:
worksheet["C1:C6"] = new object[] { "Title", "A", "B", "C", "D", "E" };
标题行不参与筛选/排序:
排序示例(Z→A):
标题行保持不动:
API 参考
AutoColumnFilter
| 成员 | 类型 | 描述 |
|---|---|---|
Worksheet | Worksheet | 关联的工作表 |
ApplyRange | RangePosition | 被筛选的范围 |
Columns | FilterColumnCollection | 按索引或列代码访问列筛选主体 |
Apply() | void | 重新评估筛选器并隐藏/显示行 |
Attach(Worksheet, AutoColumnFilterUI) | void | 将筛选器附加到工作表 |
Detach() | void | 从工作表移除筛选器 |
FilterButtonPressed | event | 列筛选按钮被点击时触发 |
FilterColumnCollection
| 成员 | 描述 |
|---|---|
this[int index] | 按从零开始的列索引获取列筛选主体 |
this[string columnCode] | 按列地址代码(如 "C")获取列筛选主体 |
AutoColumnFilterBody
筛选器中的每列都有一个 AutoColumnFilterBody,包含以下成员:
| 成员 | 类型 | 描述 |
|---|---|---|
ColumnHeader | ColumnHeader | 列标题实例 |
IsSelectAll | bool | 是否选中了所有项目(列未被筛选) |
SelectedTextItems | TextFilterCollection | 已选择(可见)的文本值集合 |
GetDistinctItems() | List<string> | 获取列中所有唯一值 |
TextFilterCollection
| 方法 | 描述 |
|---|---|
Add(string item) | 向已选集合中添加项目 |
AddRange(IEnumerable<string> items) | 添加多个项目 |
Remove(string item) | 移除项目 |
Clear() | 清除所有已选项目 |
Contains(string item) | 检查项目是否已选中 |
Count | 已选项目数量 |
this[string item] | 获取或设置项目是否已选中 |
AutoColumnFilterUI 枚举
| 值 | 描述 |
|---|---|
NoGUI | 不创建 UI 元素 |
DropdownButton | 仅在标题上显示下拉按钮 |
DropdownButtonAndPanel | 显示下拉按钮和内置筛选面板(默认) |
FilterButtonPressedEventArgs
| 属性 | 类型 | 描述 |
|---|---|---|
ColumnHeader | ColumnHeader | 按钮被按下的列标题 |
IsCancelled | bool | 设置为 true 以阻止内置弹出窗口打开 |
filter.FilterButtonPressed += (s, e) =>
{
// 显示自定义筛选 UI 代替内置弹出窗口
e.IsCancelled = true;
ShowCustomFilterDialog(e.ColumnHeader);
};