WPF中基于文本框输入值匹配列值过滤SQL初始化的DataGrid
DataGrid 基于文本框输入ID的等值过滤实现
你初始化加载数据的核心逻辑如下:
NpgsqlCommand cmd = new NpgsqlCommand("select * from central.equipment where equipment.deleted = 1", con); NpgsqlDataAdapter da = new NpgsqlDataAdapter(); da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); dataGridView1.Columns[0].Name = "emp_id"; dataGridView1.Columns[0].HeaderText = "Employee ID"; dataGridView1.Columns[0].DataPropertyName = "emp_id";
适配现有WinForm DataGridView的实现
无需重新向数据库发起查询,直接复用已加载到内存的DataTable,通过内置DataView的过滤能力就能实现和内连接一致的等值匹配效果:
- 初始化完成后,给DataGridView绑定数据源时持有DataTable对象,不要完成填充就丢失对象引用
在现有初始化代码最后补充绑定逻辑:// 把DataTable绑定到控件,后续调整过滤规则直接操作对应视图即可 dataGridView1.DataSource = dt; - 给输入ID的文本框绑定文本变化事件,在回调逻辑里修改视图过滤规则
假设文本框名为txt_EmpIdFilter,对应事件代码:private void txt_EmpIdFilter_TextChanged(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(txt_EmpIdFilter.Text)) { // 文本框清空时展示全部已加载的数据 dt.DefaultView.RowFilter = string.Empty; } else { // 对数值类型的emp_id列做精准等值匹配,和内连接的关联逻辑完全一致 dt.DefaultView.RowFilter = $"emp_id = {txt_EmpIdFilter.Text.Trim()}"; } }
实现注意事项
- 这套逻辑是纯内存级操作,不会反复请求数据库,过滤响应速度为毫秒级
- 如果
emp_id是字符串类型,把过滤规则调整为支持单引号转义的写法,避免RowFilter语法报错:dt.DefaultView.RowFilter = $"emp_id = '{txt_EmpIdFilter.Text.Trim().Replace("'", "''")}'"; - 过滤逻辑仅作用于视图层:不符合匹配规则的行会被临时隐藏,不会删除内存DataTable里的原始数据,清空过滤条件就能立刻还原全部记录
纯WPF DataGrid场景的实现
- 注意:你现有代码中的
dataGridView1是WinForm平台的控件,如果是纯WPF项目,对应控件是DataGrid,不要套用WinForm的DataView逻辑,通过CollectionViewSource实现绑定过滤即可 - 初始化时将数据集合挂载到CollectionViewSource上
- 监听文本框的输入变化,在过滤回调里逐行判断emp_id和输入值是否匹配,不满足匹配规则的行会被自动排除在DataGrid的展示范围外
内容的提问来源于stack exchange,提问作者user15213948
相关产品推荐
相关产品推荐

