You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
        }
    }
}

关键说明

  1. 列头交互改造:通过DataGridTextColumn.HeaderTemplate给TYPE列添加筛选按钮,让静态列头具备筛选触发能力。
  2. DataView筛选逻辑:DataTable.DefaultView.RowFilter是WPF中过滤DataTable数据的轻量方案,筛选表达式格式类似SQL的WHERE子句。
  3. 菜单动态构建:根据指定选项动态生成菜单项,点击后实时更新筛选条件,DataGrid会自动同步显示过滤后的结果。

内容的提问来源于stack exchange,提问作者nojob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:40:25