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

DataGridView双条件RowFilter示例咨询及C# Excel筛选问题求助

DataGridView与Excel双条件筛选问题解答

一、你的代码问题分析

你写的这段代码:

(dataGridView1.DataSource as System.Data.DataTable).DefaultView.RowFilter = string.Format("state like '%" + txtName.Text + "%','%" + txtStatus.Text + "%'");

完全不可行,问题出在这几点:

  1. RowFilter语法错误:两个条件之间必须用逻辑运算符(AND/OR)连接,用逗号分隔是无效写法
  2. string.Format用法错误:你没有使用格式化占位符,直接拼接字符串属于冗余操作
  3. 存在语法异常风险:用户输入的文本如果包含单引号,会直接导致筛选语句报错

正确写法需用逻辑运算符连接条件,同时处理特殊字符,比如要同时匹配两个条件:

var filter = string.Format("state LIKE '%{0}%' AND status LIKE '%{1}%'", 
                          txtName.Text.Replace("'", "''"), 
                          txtStatus.Text.Replace("'", "''"));
(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = filter;

注:替换单引号是为了避免用户输入带单引号的文本导致筛选语法错误

二、DataGridView双条件RowFilter示例

示例1:两个文本条件(AND/OR)

// 同时满足姓名包含指定值,且状态等于"已完成"
dataGridView1.DefaultView.RowFilter = "Name LIKE '%张三%' AND Status = '已完成'";

// 满足姓名包含指定值,或者状态等于"已完成"
dataGridView1.DefaultView.RowFilter = "Name LIKE '%张三%' OR Status = '已完成'";

示例2:结合日期条件(搭配DateTimePicker)

如果要筛选日期在指定范围,同时匹配文本条件:

// 筛选创建日期在DateTimePicker1和DateTimePicker2之间,且状态为"待处理"
var startDate = dateTimePicker1.Value.ToString("yyyy-MM-dd");
var endDate = dateTimePicker2.Value.ToString("yyyy-MM-dd");
dataGridView1.DefaultView.RowFilter = string.Format("CreateDate >= #{0}# AND CreateDate <= #{1}# AND Status = '待处理'", startDate, endDate);

注:RowFilter中日期必须用#包裹,格式要与DataTable内的日期格式匹配

三、C#操作Excel的双条件筛选(结合DateTimePicker)

场景1:用OLEDB将Excel作为数据库查询

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    // 结合DateTimePicker的日期范围和状态条件
    string query = string.Format(@"SELECT * FROM [Sheet1$] 
                                  WHERE CreateDate >= #{0}# 
                                  AND CreateDate <= #{1}# 
                                  AND Status LIKE '%{2}%'",
                                  dateTimePicker1.Value.ToString("yyyy-MM-dd"),
                                  dateTimePicker2.Value.ToString("yyyy-MM-dd"),
                                  txtStatus.Text.Replace("'", "''"));
    OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
    DataTable dt = new DataTable();
    adapter.Fill(dt);
    dataGridView1.DataSource = dt;
}

场景2:用EPPlus直接操作Excel单元格

using (ExcelPackage package = new ExcelPackage(new FileInfo("C:\\test.xlsx")))
{
    ExcelWorksheet sheet = package.Workbook.Worksheets["Sheet1"];
    // 开启自动筛选,范围为第2行到最后一行
    sheet.Cells["A2:Z" + sheet.Dimension.End.Row].AutoFilter = true;
    // 设置日期列(假设是第3列)的范围筛选
    sheet.AutoFilter.Columns[3].FilterType = ExcelFilterType.DateBetween;
    sheet.AutoFilter.Columns[3].DateFilter.StartDate = dateTimePicker1.Value;
    sheet.AutoFilter.Columns[3].DateFilter.EndDate = dateTimePicker2.Value;
    // 设置状态列(假设是第5列)的包含筛选
    sheet.AutoFilter.Columns[5].FilterType = ExcelFilterType.Contains;
    sheet.AutoFilter.Columns[5].TextFilter.Add(txtStatus.Text);
    // 保存更改
    package.Save();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:25:15