如何通过TextBox在DataGridView中搜索指定行?代码异常求助
问题排查与修复方案
嘿,我一眼就瞅出问题在哪了——你写搜索按钮代码的时候,犯了个很容易踩的小坑:你直接把txt_Search_Id控件本身传到字符串格式化里了,而不是获取它的**Text属性**!
这会导致生成的RowFilter条件变成类似 CONVERT(Id_Student, System.String) like '%System.Windows.Forms.TextBox, Text: 你的输入内容%' 这种完全无效的筛选规则,自然找不到匹配的行,DataGridView就被清空了。
修复后的代码
private void Search_Click(object sender, EventArgs e) { // 先拿到输入框的文本,顺便去掉前后空格 string searchContent = txt_Search_Id.Text.Trim(); DataView DV = dt.DefaultView; if (string.IsNullOrEmpty(searchContent)) { // 如果输入为空,直接显示所有数据 DV.RowFilter = string.Empty; } else { // 这里要使用控件的Text属性,同时处理特殊字符避免语法错误 DV.RowFilter = string.Format("CONVERT(Id_Student, System.String) LIKE '%{0}%'", searchContent.Replace("'", "''")); } // 直接绑定DataView就好,不用转成DataTable,还能保留排序等特性 dataGridView1.DataSource = DV; }
几个额外的优化点
- 直接绑定DataView而非转成DataTable:这样可以保留DataView自带的排序、筛选等功能,后续操作更灵活。
- 处理空输入:当用户清空搜索框时,自动恢复显示所有数据,提升体验。
- 替换单引号:避免用户输入特殊字符导致筛选语法报错(虽然DataView的RowFilter不会有SQL注入风险,但能防止意外的语法异常)。
- Trim输入文本:避免用户不小心输入的前后空格导致匹配失败。
内容的提问来源于stack exchange,提问作者Dzeko
相关产品推荐
相关产品推荐

