如何在C# WPF的DataTable中实现列头筛选功能?
WPF .NET 6 DataTable列头筛选实现示例
实现思路
通过自定义DataGrid列头模板,给目标列(如TYPE列)添加筛选下拉按钮,点击按钮弹出包含指定选项的菜单,选择后利用DataView.RowFilter过滤DataTable数据,实现列值筛选效果。
XAML 代码
<Window x:Class="WpfDataGridFilter.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataTable列头筛选示例" Height="450" Width="800"> <Grid> <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" Margin="10"> <DataGrid.Columns> <!-- 普通列示例 --> <DataGridTextColumn Header="ID" Binding="{Binding ID}" Width="*"/> <!-- 带筛选的TYPE列 --> <DataGridTextColumn Binding="{Binding TYPE}" Width="*"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="TYPE" VerticalAlignment="Center"/> <Button x:Name="filterBtn" Content="▼" FontSize="10" Padding="2,0" Margin="5,0" Click="FilterBtn_Click"/> </StackPanel> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn> <DataGridTextColumn Header="NAME" Binding="{Binding NAME}" Width="*"/> </DataGrid.Columns> </DataGrid> </Grid> </Window>
C# 后台代码
using System.Data; using System.Windows; using System.Windows.Controls; namespace WpfDataGridFilter { public partial class MainWindow : Window { private DataTable _dataTable; public MainWindow() { InitializeComponent(); // 初始化DataTable并填充测试数据 InitDataTable(); dataGrid.ItemsSource = _dataTable.DefaultView; } private void InitDataTable() { _dataTable = new DataTable(); _dataTable.Columns.Add("ID", typeof(int)); _dataTable.Columns.Add("TYPE", typeof(string)); _dataTable.Columns.Add("NAME", typeof(string)); // 添加测试数据 _dataTable.Rows.Add(1, "A", "张三"); _dataTable.Rows.Add(2, "B", "李四"); _dataTable.Rows.Add(3, "A", "王五"); _dataTable.Rows.Add(4, "C", "赵六"); _dataTable.Rows.Add(5, "B", "孙七"); } private void FilterBtn_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; // 创建筛选菜单 ContextMenu filterMenu = new ContextMenu(); // 添加"全部"选项,用于取消筛选 MenuItem itemAll = new MenuItem() { Header = "全部" }; itemAll.Click += (s, args) => { _dataTable.DefaultView.RowFilter = string.Empty; filterMenu.IsOpen = false; }; filterMenu.Items.Add(itemAll); // 添加分隔线 filterMenu.Items.Add(new Separator()); // 添加A/B/C筛选选项 string[] filterOptions = { "A", "B", "C" }; foreach (var option in filterOptions) { MenuItem item = new MenuItem() { Header = option }; item.Click += (s, args) => { // 设置筛选条件,过滤TYPE列匹配当前选项的数据 _dataTable.DefaultView.RowFilter = $"TYPE = '{option}'"; filterMenu.IsOpen = false; }; filterMenu.Items.Add(item); } // 绑定按钮为菜单载体并显示 filterMenu.PlacementTarget = btn; filterMenu.IsOpen = true; } } }
关键说明
- 列头交互改造:通过
DataGridTextColumn.HeaderTemplate给TYPE列添加筛选按钮,让静态列头具备筛选触发能力。 - DataView筛选逻辑:
DataTable.DefaultView.RowFilter是WPF中过滤DataTable数据的轻量方案,筛选表达式格式类似SQL的WHERE子句。 - 菜单动态构建:根据指定选项动态生成菜单项,点击后实时更新筛选条件,DataGrid会自动同步显示过滤后的结果。
内容的提问来源于stack exchange,提问作者nojob
相关产品推荐
相关产品推荐

