VB.NET中双击DataGridView出现类过滤效果问题排查(Kimtoo.Bindingprovider)
排查VB.NET中Kimtoo.BindingProvider绑定DataGridView双击后数据异常问题
使用Kimtoo.BindingProvider NuGet包实现DataGridView数据绑定,双击DataGridView后控件仅显示部分数据(类似过滤状态),而非全部数据,怀疑代码存在问题。
相关代码
Private record As TEST Private Sub LoadData() Try Dim data As List(Of TEST) = Con.Query(Of TEST)("Select * From TEST").ToList() DataGridView1.Bind(data) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub DataGridView1_DoubleClick(sender As Object, e As EventArgs) Handles DataGridView1.DoubleClick Me.record = DirectCast(DataGridView1.CurrentRow.Tag, TEST) BindingProvider1.Bind(record) LoadData() End Sub
现象描述
- 双击前:DataGridView显示完整的TEST表数据集
- 双击后:DataGridView仅显示少量数据,呈现类似过滤后的状态
问题原因分析
DoubleClick事件中先将单个TEST对象绑定到BindingProvider1,再调用LoadData重新绑定全量数据。Kimtoo.BindingProvider的绑定机制可能存在上下文共享问题:绑定单个对象后,DataGridView的绑定源被意外关联到该单个对象的上下文,导致后续全量数据绑定被过滤,仅显示与该对象匹配的数据。
解决方案
- 调整事件执行顺序
先刷新全量数据绑定,再绑定单个记录,避免上下文干扰:
Private Sub DataGridView1_DoubleClick(sender As Object, e As EventArgs) Handles DataGridView1.DoubleClick Me.record = DirectCast(DataGridView1.CurrentRow.Tag, TEST) LoadData() ' 优先刷新全量数据 BindingProvider1.Bind(record) ' 再绑定单个记录 End Sub
- 确保数据源独立性
在LoadData中创建全新的List实例,避免复用可能被污染的数据源上下文:
Private Sub LoadData() Try Dim data As New List(Of TEST)(Con.Query(Of TEST)("Select * From TEST")) DataGridView1.Bind(data) Catch ex As Exception MsgBox(ex.Message) End Try End Sub
- 验证Row.Tag赋值正确性
确认DataGridView绑定数据时,每行的Tag属性已正确赋值为对应的TEST对象,避免DirectCast返回空值引发异常绑定状态。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

