如何使用BindingSource.Find在DataSet指定表中查找值并修改数据?
正确实现BindingSource查找与数据修改的方法
先帮你梳理下原代码里的几个问题:
Find方法的用法有误:你传入的DataSet.Tables("TableName").Rows("myIDNum")是用列名索引行,这会报错,应该传入具体的ID数值;而且没必要在遍历里重复调用Find,完全是性能浪费。FACID("ColumnName")这个变量没定义,应该从目标行里获取对应列的值。DirectCast(myBindingSource(row), DataRowView)的转换逻辑多余,循环里的row本身就是DataRowView类型。
下面给你两种场景下的正确实现方案:
场景一:查找单个匹配行(精准定位)
如果你只需要找某一个特定ID的记录,直接用BindingSource.Find定位行索引即可,不用遍历整个数据源:
' 先从DataSet的目标表中拿到要查找的ID值(这里假设取表中第一行的myIDNum,你可以根据实际需求调整) Dim targetID As Integer = CInt(DataSet.Tables("TableName").Rows(0)("myIDNum")) ' 在BindingSource中查找该ID对应的行索引 Dim foundIndex As Integer = myBindingSource.Find("myIDNum", targetID) If foundIndex >= 0 Then ' 获取找到的目标行 Dim foundRow As DataRowView = DirectCast(myBindingSource(foundIndex), DataRowView) ' 判断列值是否符合条件 If foundRow("ColumnName").ToString() = "Something" Then ' 修改目标列的数值 foundRow("Column") = "Something else" End If Else ' 未找到匹配行的处理逻辑 MessageBox.Show("未找到对应ID的记录") End If
场景二:批量匹配并修改多行
如果需要匹配DataSet目标表中的多个ID,再批量修改符合条件的行,就用遍历的方式:
' 先把DataSet目标表中所有需要匹配的ID收集到列表里 Dim targetIDs As New List(Of Integer)() For Each tableRow As DataRow In DataSet.Tables("TableName").Rows targetIDs.Add(CInt(tableRow("myIDNum"))) Next ' 遍历BindingSource的每一行,匹配条件并修改 For Each row As DataRowView In myBindingSource Dim currentID As Integer = CInt(row("myIDNum")) ' 判断当前行ID是否在目标集合中 If targetIDs.Contains(currentID) Then ' 检查列值条件 If row("ColumnName").ToString() = "Something" Then row("Column") = "Something else" End If End If Next ' 如果绑定了DataGridView这类控件,修改后刷新UI myBindingSource.ResetBindings(False)
几个关键注意事项
Find方法的前提:BindingSource.Find要求绑定的数据源支持索引查找,建议给DataTable设置主键:DataSet.Tables("TableName").PrimaryKey = {DataSet.Tables("TableName").Columns("myIDNum")}- UI刷新:如果修改数据后界面没更新,调用
myBindingSource.ResetBindings(False)即可,False表示只刷新数据,不重新绑定架构。 - 类型安全:尽量用
CInt、TryCast这类安全的类型转换方式,避免出现类型转换异常。
内容的提问来源于stack exchange,提问作者lolikols
相关产品推荐
相关产品推荐

