LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】在DataGridView中实现数据的筛选功能

admin
2026年1月18日 21:9 本文热度 57

在 DataGridView 中实现数据筛选功能,这是展示数据时的常用需求。核心思路是基于全局原始数据源进行条件筛选,生成筛选结果集,再将结果集重新绑定到 DataGridView 刷新展示,且始终保留原始数据源不被修改,确保筛选操作可重复、无数据丢失。下面基于之前的 Student 实体和全局数据源,详细讲解两种常用筛选实现(精准筛选 + 模糊筛选),包含完整代码和关键细节。

一、前置回顾(保持衔接)

 1. 全局原始数据源(所有筛选操作均基于此,不直接修改):



1
2
3
4
5
6
7
8
9

// 全局学生集合(原始数据源,保留所有数据,筛选仅生成副本)
private List<Student> _studentGlobalList = new List<Student>()
{
    new Student(){ Id=1, Name="张三", Age=18, ClassName="高一(1)班"},
    new Student(){ Id=2, Name="李四", Age=17, ClassName="高一(2)班"},
    new Student(){ Id=3, Name="王五", Age=18, ClassName="高一(1)班"},
    new Student(){ Id=4, Name="张小三", Age=19, ClassName="高一(1)班"},
    new Student(){ Id=5, Name="李小四", Age=17, ClassName="高一(2)班"}
};



 2. 通用数据绑定方法(封装,用于刷新 DataGridView 展示):



1
2
3
4
5
6
7
8
9
10
11
12
13

// 通用数据绑定方法,接收筛选结果集并绑定到 DataGridView
private void BindDataToDgv(List<Student> dataList)
{
    // 先清空原有绑定(避免数据残留、列重复问题)
    dgvStudent.DataSource = null;
    // 重新绑定新数据源(筛选结果集)
    dgvStudent.DataSource = dataList;
    // 优化表头显示(可选)
    dgvStudent.Columns["Id"].HeaderText = "学生ID";
    dgvStudent.Columns["Name"].HeaderText = "学生姓名";
    dgvStudent.Columns["Age"].HeaderText = "年龄";
    dgvStudent.Columns["ClassName"].HeaderText = "所在班级";
}



 3. 窗体基础控件(补充筛选所需输入控件):

  • • 新增 TextBox 控件(命名 txtFilterName):输入姓名筛选条件
  • • 新增 TextBox 控件(命名 txtFilterClass):输入班级筛选条件
  • • 新增 Button 控件(命名 btnFilter):触发筛选操作
  • • 新增 Button 控件(命名 btnResetFilter):重置筛选,返回全部数据

二、筛选核心原理

  • • 保留原始数据源:始终以 _studentGlobalList 作为筛选基准,不删除、不修改其中的数据,避免后续筛选无完整数据可用。
  • • 生成筛选副本:通过 LINQ 表达式对原始数据源进行条件过滤,生成独立的筛选结果集(List 类型),仅操作该副本。
  • • 重新绑定刷新:将筛选结果集通过 BindDataToDgv 方法绑定到 DataGridView.DataSource,实现筛选结果的展示。
  • • 支持重置还原:提供重置按钮,直接将原始数据源重新绑定,恢复表格的完整数据展示。

三、完整筛选实现(模糊筛选 + 多条件组合 + 重置)

1. 核心筛选代码(按钮点击事件,多条件组合)
实现「姓名模糊筛选」+「班级模糊筛选」,支持单个条件筛选,也支持两个条件组合筛选,同时兼容空输入(空输入时忽略对应条件)。
实现代码



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

private void btnFilter_Click(object sender, EventArgs e)
{
    // 1. 获取输入的筛选条件,去除首尾空格并转为小写(忽略大小写,提升用户体验)
    string filterName = txtFilterName.Text.Trim().ToLower();
    string filterClass = txtFilterClass.Text.Trim().ToLower();

    // 2. 核心:使用 LINQ 对原始数据源进行条件筛选
    // Where 方法接收筛选表达式,满足条件的元素会被保留到结果集中
    var filterResult = _studentGlobalList
        .Where(student => 
            // 条件1:姓名模糊匹配(输入非空时生效,空时忽略该条件)
            (string.IsNullOrEmpty(filterName) || student.Name.ToLower().Contains(filterName))
            &&
            // 条件2:班级模糊匹配(输入非空时生效,空时忽略该条件)
            (string.IsNullOrEmpty(filterClass) || student.ClassName.ToLower().Contains(filterClass))
        )
        .ToList(); // 将 LINQ 查询结果转为 List<Student>,方便绑定到 DataGridView

    // 3. 绑定筛选结果集,刷新 DataGridView 展示
    BindDataToDgv(filterResult);

    // 4. 友好提示:无匹配数据时给出提示
    if (filterResult.Count == 0)
    {
        MessageBox.Show("未查询到符合筛选条件的数据!", "筛选结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    else
    {
        MessageBox.Show($"筛选成功!共查询到 {filterResult.Count} 条符合条件的数据。", "筛选结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}



2. 重置筛选代码(恢复全部数据)



1
2
3
4
5
6
7
8
9
10
11

private void btnResetFilter_Click(object sender, EventArgs e)
{
    // 1. 清空筛选输入框
    txtFilterName.Clear();
    txtFilterClass.Clear();
 
    // 2. 直接绑定原始全局数据源,恢复全部数据展示
    BindDataToDgv(_studentGlobalList);
 
    MessageBox.Show("筛选已重置,展示全部数据!", "重置成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}



3. 扩展:精准筛选(按 ID / 年龄 等值匹配)
除了模糊筛选,实际开发中还常需要精准筛选(如按学生 ID、固定年龄筛选),核心仍为 LINQ 条件匹配,只需修改筛选表达式即可:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

// 示例:按年龄精准筛选(筛选年龄=18的学生)
private void btnFilterAge_Click(object sender, EventArgs e)
{
    // 1. 获取并验证输入条件(年龄为数字)
    if (!int.TryParse(txtFilterAge.Text.Trim(), out int targetAge))
    {
        MessageBox.Show("请输入有效的数字作为筛选年龄!", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        txtFilterAge.Focus();
        return;
    }

    // 2. LINQ 精准筛选(等值匹配)
    var filterResult = _studentGlobalList
        .Where(student => student.Age == targetAge)
        .ToList();

    // 3. 绑定结果并刷新
    BindDataToDgv(filterResult);

    // 4. 无数据提示
    if (filterResult.Count == 0)
    {
        MessageBox.Show($"未查询到年龄为 {targetAge} 的学生数据!", "筛选结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}



四、关键知识点说明

 1、LINQ 筛选的核心作用:
Where() 方法是 LINQ 中用于数据筛选的核心方法,它接收一个布尔类型的 Lambda 表达式作为筛选条件,遍历原始数据源中的每一个元素,仅保留满足条件的元素,最终返回一个 IEnumerable 类型的查询结果,后续通过 ToList() 转为 List,方便与 DataGridView.DataSource 绑定(DataSource 对 List 有更好的支持)。
2、模糊筛选 vs 精准筛选的区别:

  • • 模糊筛选:使用 string.Contains() 方法,匹配包含目标字符串的所有结果(如输入「张」,会匹配「张三」「张小三」),适合姓名、班级等文本类型数据,支持忽略大小写(ToLower()/ToUpper())。
  • • 精准筛选:使用 == 等值运算符,仅匹配与目标值完全一致的结果(如输入「18」,仅返回年龄 = 18 的学生),适合 ID、年龄、性别等有明确唯一值的数据类型。
    3、筛选的边界处理与优化:
  • • 兼容空输入:当筛选输入框为空时,通过 string.IsNullOrEmpty() 判断,直接忽略该筛选条件,避免空输入导致无数据返回。
  • • 数据类型验证:对于数字类型的筛选条件(如 ID、年龄),使用 int.TryParse() 验证输入合法性,避免格式错误导致程序异常。
  • • 保留原始数据源:所有筛选操作均不修改 _studentGlobalList,仅操作其副本,确保筛选、重置操作可重复执行,无数据丢失风险。
    4、实时筛选扩展(可选):
    除了通过按钮触发筛选,还可以实现「实时筛选」(输入内容变化时自动筛选),只需绑定 TextBox 的 TextChanged 事件,将筛选逻辑移入该事件即可:


1
2
3
4
5
6
7
8
9

private void txtFilterName_TextChanged(object sender, EventArgs e)
{
    // 直接复用筛选逻辑,实现实时模糊筛选
    string filterName = txtFilterName.Text.Trim().ToLower();
    var filterResult = _studentGlobalList
        .Where(student => string.IsNullOrEmpty(filterName) || student.Name.ToLower().Contains(filterName))
        .ToList();
    BindDataToDgv(filterResult);
}



五、使用须知

  • • 1、确保窗体上已添加对应的输入框和按钮,并绑定相应的点击事件 / 文本变化事件。
  • • 2、依赖之前定义的 Student 实体、_studentGlobalList 全局数据源和 BindDataToDgv 绑定方法,无需额外修改已有代码。
  • • 3、运行后,在输入框中输入筛选条件,点击「筛选」按钮即可看到结果,点击「重置」可恢复全部数据,支持多条件组合筛选。

六、总结

  • • 1、筛选功能的核心:保留原始数据源 → LINQ 生成筛选副本 → 重新绑定刷新 DataGridView。
  • • 2、关键技术:LINQ Where() 方法实现条件筛选,Contains() 实现模糊匹配,== 实现精准匹配,ToList() 完成结果集转换。
  • • 3、核心注意点:始终不修改原始数据源,做好输入验证和边界处理,支持筛选重置,提升用户体验。
  • • 4、扩展方向:可通过 TextChanged 事件实现实时筛选,或增加更多筛选条件(如日期范围、多值选择)满足复杂业务需求。


阅读原文:原文链接


该文章在 2026/1/19 10:37:38 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved