如何使用BindingSource.Find方法实现数值列的非精确匹配查找
VB.NET GridView尺寸邻近查找实现方案
问题原因
- 原生
BindingSource.Find方法仅支持精确值匹配,本身不具备邻近值查找能力 - 对数值类型字段使用
LIKE做模糊匹配属于逻辑错误:LIKE是字符串匹配规则,既无法对Double类型生效,就算强制类型转换匹配,返回结果也不符合邻近尺寸的业务要求
实现逻辑
按照业务优先级分三步处理:
- 校验输入合法性,将文本框输入的尺寸值转换为Double类型,避免类型错误
- 优先执行精确匹配,匹配成功直接定位到对应记录
- 精确匹配无结果时,从已加载的DataTable数据源中计算最接近的邻近值:
- 筛选所有小于搜索值的尺寸,取其中最大值(最接近的下适配尺寸)
- 筛选所有大于搜索值的尺寸,取其中最小值(最接近的上适配尺寸)
- 边界场景处理:如果仅存在单侧邻近值,直接取该值定位;如果双侧值都存在,优先选择与搜索值差值更小的尺寸定位
可直接运行的实现代码
' 输入值类型转换与合法性校验 Dim targetSize As Double If Not Double.TryParse(TextBox1.Text, targetSize) Then MessageBox.Show("请输入有效的数字尺寸") Return End If ' 优先执行精确匹配 Dim exactIndex As Integer = TblDiesBindingSource.Find("IDSIZE", targetSize) If exactIndex >= 0 Then TblDiesBindingSource.Position = exactIndex Return End If ' 精确匹配无结果时查找邻近值 Dim bindData As DataTable = CType(TblDiesBindingSource.DataSource, DataTable) ' 按尺寸升序排序,简化邻近值查找逻辑 Dim sortedSizeRows = bindData.AsEnumerable().OrderBy(Function(row) row.Field(Of Double)("IDSIZE")).ToList() ' 分别获取上下最接近的尺寸记录 Dim nearestLower = sortedSizeRows.LastOrDefault(Function(row) row.Field(Of Double)("IDSIZE") < targetSize) Dim nearestHigher = sortedSizeRows.FirstOrDefault(Function(row) row.Field(Of Double)("IDSIZE") > targetSize) Dim finalTargetRow As DataRow = Nothing ' 处理单侧值存在的边界情况 If nearestLower Is Nothing Then finalTargetRow = nearestHigher ElseIf nearestHigher Is Nothing Then finalTargetRow = nearestLower Else ' 双侧值都存在时选差值更小的 Dim gapLower = targetSize - nearestLower.Field(Of Double)("IDSIZE") Dim gapHigher = nearestHigher.Field(Of Double)("IDSIZE") - targetSize finalTargetRow = If(gapLower <= gapHigher, nearestLower, nearestHigher) End If ' 定位到最终找到的记录 If finalTargetRow IsNot Nothing Then Dim targetIndex = TblDiesBindingSource.Find("IDSIZE", finalTargetRow.Field(Of Double)("IDSIZE")) TblDiesBindingSource.Position = targetIndex End If
补充说明
- 所有计算都在内存中已加载的DataTable上执行,不需要额外访问Access数据库,千条级数据量下无性能损耗
- 如果业务需要同时展示上下两个可适配尺寸供人工选择,直接读取
nearestLower和nearestHigher对应的尺寸值即可,不需要修改核心查找逻辑 - 不需要限定查找范围,全量尺寸都会参与邻近值计算
内容的提问来源于stack exchange,提问作者Lloyd
相关产品推荐
相关产品推荐

