You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:21:12