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)

默认情况下,每个列标题上会添加一个下拉按钮:143

点击它可以看到候选列表(从 DisplayText 收集):144

要创建不带 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 的属性,如 TextIsChecked
  • 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);

结果: 152

在 ReoGrid 编辑器中创建筛选

在编辑器应用中,选择数据范围(不包括标题行),然后选择 Sheet → Filter 以添加下拉按钮。示例设置:

worksheet["C1:C6"] = new object[] { "Title", "A", "B", "C", "D", "E" };

标题行不参与筛选/排序:148

排序示例(Z→A):149

标题行保持不动:151

API 参考

AutoColumnFilter

成员类型描述
WorksheetWorksheet关联的工作表
ApplyRangeRangePosition被筛选的范围
ColumnsFilterColumnCollection按索引或列代码访问列筛选主体
Apply()void重新评估筛选器并隐藏/显示行
Attach(Worksheet, AutoColumnFilterUI)void将筛选器附加到工作表
Detach()void从工作表移除筛选器
FilterButtonPressedevent列筛选按钮被点击时触发

FilterColumnCollection

成员描述
this[int index]按从零开始的列索引获取列筛选主体
this[string columnCode]按列地址代码(如 "C")获取列筛选主体

AutoColumnFilterBody

筛选器中的每列都有一个 AutoColumnFilterBody,包含以下成员:

成员类型描述
ColumnHeaderColumnHeader列标题实例
IsSelectAllbool是否选中了所有项目(列未被筛选)
SelectedTextItemsTextFilterCollection已选择(可见)的文本值集合
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

属性类型描述
ColumnHeaderColumnHeader按钮被按下的列标题
IsCancelledbool设置为 true 以阻止内置弹出窗口打开
filter.FilterButtonPressed += (s, e) =>
{
    // 显示自定义筛选 UI 代替内置弹出窗口
    e.IsCancelled = true;
    ShowCustomFilterDialog(e.ColumnHeader);
};

相关主题

这篇文章对您有帮助吗?