使用BindingSource.Find方法时如何允许空文本框不参与检索
问题根因
IDSIZE是Access中的整数类型列,BindingSource.Find方法要求传入的搜索值与目标字段类型兼容。txtIdSize留空时传入的是空字符串,无法被解析为整数,因此触发格式错误。
原有代码存在逻辑缺陷:将描述字段筛选和IDSIZE匹配拆成两步执行,既没有对空输入做合法性判断,也无法实现两个条件同时生效的交集检索。
修复方案
核心逻辑是动态拼接筛选条件:只有对应输入框存在合法有效值时,才把该字段的检索规则加入筛选器,空值/非法输入对应的条件直接忽略;无需调用Find方法,统一通过Filter属性实现组合检索。
- 字符串类型字段(Descript):判断输入非空时,加入LIKE模糊匹配规则,额外处理单引号转义避免语法错误
- 整数类型字段(IDSIZE):用
Integer.TryParse校验输入是否为合法整数,校验通过才加入等值匹配规则,留空/输入非整数时直接跳过 - 所有有效条件用
AND拼接,无有效条件时清空筛选器显示全量数据,筛选完成后自动定位到第一条结果
修正后的可直接运行代码如下:
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click Dim filterConditions As New List(Of String)() ' 处理描述字段模糊检索 Dim descText = txtDescription.Text.Trim() If Not String.IsNullOrEmpty(descText) Then ' 转义文本中的单引号,避免Filter语法报错 descText = descText.Replace("'", "''") filterConditions.Add($"Descript LIKE '%{descText}%'") End If ' 处理整数类型IDSIZE检索 Dim sizeText = txtIdSize.Text.Trim() Dim sizeValue As Integer If Integer.TryParse(sizeText, sizeValue) Then filterConditions.Add($"IDSIZE = {sizeValue}") End If ' 应用最终筛选规则 If filterConditions.Count > 0 Then TblDiesBindingSource.Filter = String.Join(" AND ", filterConditions) Else TblDiesBindingSource.Filter = Nothing End If ' 定位到筛选结果第一条,无匹配结果时不执行定位避免报错 If TblDiesBindingSource.Count > 0 Then TblDiesBindingSource.Position = 0 End If End Sub
该实现完全支持灵活检索:仅填单个字段就按单字段搜索,两个字段都填就按交集条件搜索,两个字段都空就显示全量数据,同时兼容用户输入非数字内容的异常场景,不会触发格式错误。
内容的提问来源于stack exchange,提问作者Lloyd
相关产品推荐
相关产品推荐

