C#中如何按ComboBox选项筛选DataGridView控件中的数据并解决报错
报错原因与解决方案
你遇到的Invalid Column 'drink'错误属于SQL语法问题:ProdCat是字符串类型的字段,你拼接SQL语句时没有给匹配值加单引号,导致SQL引擎把drink识别为列名而非要匹配的字符串值,最终抛出列不存在的异常。
另外直接拼接SQL字符串存在严重的SQL注入风险,推荐改用参数化查询,改后代码如下:
private void populateCat() { // 提前判断是否有选中值,避免空引用异常 if (CatCb2.SelectedValue == null) return; try { // 用using块自动管理连接生命周期,无需手动调用Close释放资源 using (SqlConnection Con = new SqlConnection("你的数据库连接字符串")) { Con.Open(); string CatValue = CatCb2.SelectedValue.ToString(); // SQL语句使用参数占位符 string query = "select * from ProductTbl where ProdCat = @CatValue"; SqlDataAdapter sda = new SqlDataAdapter(query, Con); // 给参数赋值,自动处理类型转义、引号包裹问题 sda.SelectCommand.Parameters.AddWithValue("@CatValue", CatValue); SqlCommandBuilder builder = new SqlCommandBuilder(sda); var ds = new DataSet(); sda.Fill(ds); ProdDGV.DataSource = ds.Tables[0]; } } catch(Exception ex) { MessageBox.Show(ex.Message); } }
代码放置位置
这个筛选方法需要在两个场景下调用:
- 窗体的
Load事件中:确保窗体初始化、ComboBox绑定完默认值之后,首次加载就显示对应筛选结果 - ComboBox的
SelectedIndexChanged事件中:用户每次切换ComboBox选中项时自动触发筛选,同步更新DataGridView展示内容
额外优化建议
- 不建议全局共用一个数据库连接,每次查询新建连接即可,ADO.NET自带连接池机制,不会产生额外性能损耗,还能避免连接泄漏问题
- 可以提前给ComboBox设置默认选中项,避免窗体加载时SelectedValue为空导致首次筛选不生效
内容的提问来源于stack exchange,提问作者Imdad Miran
相关产品推荐
相关产品推荐

