如何从BindingSource移除含Environment.Username的行?代码索引错误求助
解决BindingSource移除指定行时的索引错误问题
嘿,我来帮你搞定这个索引报错的问题!你遇到的核心问题是在遍历集合的同时修改集合,还在用递增的索引去访问元素——当你移除一行后,BindingSource里的剩余元素会自动前移,原来的row值要么会跳过元素,要么会超出实际的索引范围,自然就触发错误了。
给你两种靠谱的解决办法:
方法一:从后往前遍历(最稳妥)
倒着遍历的好处是,即使移除当前行,前面还没遍历到的元素索引不会受到任何影响,完全不会出现越界问题:
If BS.Count > 0 Then ' 从最后一行开始往前遍历,避免移除元素后索引错位 For row As Integer = BS.Count - 1 To 0 Step -1 Dim drv As DataRowView = DirectCast(BS(row), DataRowView) ' 加了忽略大小写的匹配,避免用户名大小写差异导致漏删 If drv("NTUsername").ToString.Equals(Environment.UserName, StringComparison.OrdinalIgnoreCase) Then BS.RemoveAt(row) End If Next End If
方法二:用临时列表批量移除
先把所有符合条件的行收集到临时列表里,再统一移除,这样遍历和修改操作完全分离,不会互相干扰:
If BS.Count > 0 Then Dim rowsToRemove As New List(Of DataRowView)() ' 先遍历收集所有要移除的行 For Each drv As DataRowView In BS If drv("NTUsername").ToString.Equals(Environment.UserName, StringComparison.OrdinalIgnoreCase) Then rowsToRemove.Add(drv) End If Next ' 批量移除目标行 For Each drv As DataRowView In rowsToRemove BS.Remove(drv) Next End If
为啥你的原代码会报错?
举个简单例子:假设BS有3行(索引0、1、2),其中索引1的行符合移除条件。当你移除索引1的行后,原来的索引2的行自动变成了索引1,但你的row已经加到2了,下一次访问BS(2)就会超出实际的集合长度(此时Count是2,最大索引是1),直接抛出索引越界错误。
内容的提问来源于stack exchange,提问作者lolikols
相关产品推荐
相关产品推荐

