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

VB.NET DataGridView循环删除行不彻底问题求助

解决思路

核心问题原因

使用For Each遍历DataGridView.Rows集合时,直接调用Rows.Remove(row)会修改集合结构,导致迭代器的索引逻辑混乱,后续行被跳过,因此无法删除所有符合条件的行。

具体解决方案

1. 反向遍历行索引(推荐)

从最后一行开始往前遍历,删除当前行不会影响未遍历的行的索引,避免跳过问题:

' 从最后一行开始反向遍历
For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1
    Dim row As DataGridViewRow = DataGridView1.Rows(i)
    
    ' 执行你的业务处理逻辑(设置OK或错误码)
    ' ...
    
    If row.Cells(PosEsito).Value?.ToString() = "OK" Then
        ' 执行数据库删除SQL操作
        ' ...
        
        ' 删除DataGridView中的对应行
        DataGridView1.Rows.RemoveAt(i)
    End If
Next

2. 先收集待删行再批量删除

先遍历所有行,将需要删除的行存入临时集合,遍历完成后统一删除:

Dim rowsToDelete As New List(Of DataGridViewRow)

' 遍历收集符合条件的行
For Each row As DataGridViewRow In DataGridView1.Rows
    ' 执行业务处理逻辑
    ' ...
    
    If row.Cells(PosEsito).Value?.ToString() = "OK" Then
        ' 执行数据库删除操作
        ' ...
        rowsToDelete.Add(row)
    End If
Next

' 批量删除行
For Each row As DataGridViewRow In rowsToDelete
    DataGridView1.Rows.Remove(row)
Next

3. 直接操作绑定的DataTable(更规范的绑定模式做法)

由于你的DataGridView绑定了DataTable,直接操作DataTable的行,让DataGridView自动同步更新,比直接操作控件行更可靠:

' 假设绑定的DataTable为dtSource
For i As Integer = dtSource.Rows.Count - 1 To 0 Step -1
    Dim dr As DataRow = dtSource.Rows(i)
    
    ' 执行业务处理,设置Esito列值
    ' ...
    
    If dr("Esito").ToString() = "OK" Then
        ' 执行数据库删除操作
        ' ...
        ' 删除DataTable中的行
        dr.Delete()
    End If
Next
' 提交DataTable修改,DataGridView自动刷新
dtSource.AcceptChanges()

额外注意事项

  • 数据库操作需保证事务一致性:若数据库删除失败,请勿删除DataGridView/DataTable中的行,避免数据不一致。
  • 遍历前可通过row.IsNewRow判断并跳过DataGridView的新增空白行(若开启了允许新增行功能)。

内容的提问来源于stack exchange,提问作者Roberto Rossi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:12:13