如何在不修改数据库绑定源数据前提下,将DataGridView列头下拉筛选设为不区分大小写
自动筛选下拉列表的大小写不敏感去重实现
改造核心思路
当前使用的自动筛选列组件,在生成下拉筛选项时默认采用严格大小写匹配的规则做值去重,因此会把仅大小写存在差异的同语义字符串判定为不同条目重复展示。改造全程不修改数据库存储值、不改动DataGridView单元格实际展示的原始内容,仅在筛选项生成、筛选匹配两个环节调整比对规则。
具体实现步骤
- 定位组件内部的候选值生成逻辑
找到项目中引用的DataGridViewAutoFilterColumnHeaderCell类的源码,定位到构建下拉候选值集合的方法(微软官方参考实现中该方法为BuildValuesList,负责遍历绑定源所有行、提取目标列非空值、排序去重后生成下拉选项列表)。 - 替换默认的去重规则为不区分大小写模式
将原方法中用于存候选值的字符串集合,替换为基于不区分大小写比对规则初始化的集合,修改代码如下:
原有向集合追加值的逻辑不需要改动,HashSet会自动按照规则跳过重复值——当先后遇到' 原默认实现:使用严格大小写比对的列表做去重 ' Dim distinctValues As New List(Of String)() ' 替换为:使用不区分大小写的当前文化规则做重复判定的HashSet集合 Dim distinctValues As New HashSet(Of String)(StringComparer.CurrentCultureIgnoreCase)Abba和ABBA两个值时,只会保留最先遍历到的条目展示在下拉列表中,不会出现重复项。 - 同步调整筛选匹配的大小写规则
为了避免出现下拉列表去重了,但选中筛选项后只能匹配到同大小写值的问题,需要同步修改组件中执行筛选的逻辑:- 找到组件中生成
RowFilter筛选表达式的代码段 - 给绑定的DataView增加大小写不敏感的匹配规则,示例代码:
' 对涉及字符串筛选的列,关闭大小写敏感判定 Dim targetColumn = CType(dataSource, DataView).Table.Columns(columnName) targetColumn.CaseSensitive = False ' 正常生成筛选表达式,不需要修改表达式的拼接逻辑 filterExpression = String.Format("[{0}] = '{1}'", columnName, selectedValue.Replace("'", "''")) CType(dataSource, DataView).RowFilter = filterExpression - 找到组件中生成
适配注意事项
- 整个改造过程不会对单元格展示的原始值做强制大小写转换,下拉列表中保留的条目文本、单元格显示的文本完全和数据库存储值一致
- 你之前编写的
BindingContextChanged、DataBindingComplete事件逻辑不需要做任何修改,原有的自动挂载筛选头、获取筛选状态的功能可以完全复用 - 如果当前项目是直接引用的自动筛选组件的编译好的dll,需要先将组件源码引入到项目中,再完成上述逻辑修改,否则无法触及候选值生成的内部逻辑
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

