DataGridView双条件RowFilter示例咨询及C# Excel筛选问题求助
DataGridView与Excel双条件筛选问题解答
一、你的代码问题分析
你写的这段代码:
(dataGridView1.DataSource as System.Data.DataTable).DefaultView.RowFilter = string.Format("state like '%" + txtName.Text + "%','%" + txtStatus.Text + "%'");
完全不可行,问题出在这几点:
- RowFilter语法错误:两个条件之间必须用逻辑运算符(
AND/OR)连接,用逗号分隔是无效写法 - string.Format用法错误:你没有使用格式化占位符,直接拼接字符串属于冗余操作
- 存在语法异常风险:用户输入的文本如果包含单引号,会直接导致筛选语句报错
正确写法需用逻辑运算符连接条件,同时处理特殊字符,比如要同时匹配两个条件:
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
相关产品推荐
相关产品推荐

