.net 使用Remove在DataGridViewRow上的For Each期间每隔一行命中一次

.net 使用Remove在DataGridViewRow上的For Each期间每隔一行命中一次,.net,vb.net,datagridview,foreach,.net,Vb.net,Datagridview,Foreach,假设我有一个名为gridFiles的DataGridView For Each row as DataGridView in gridFiles.Rows MsgBox(row.Cells("somekey").Value.ToString) gridFiles.Rows.Remove(row) Next 我将看到消息框,但仅限于每隔一行。我认为正在发生的是,gridFiles.Rows的内部指针关闭了,因为在下一次迭代中,行数减少了1行 我需要遍历每一行,并有条件地决定是否删

假设我有一个名为
gridFiles
的DataGridView

For Each row as DataGridView in gridFiles.Rows
    MsgBox(row.Cells("somekey").Value.ToString)
    gridFiles.Rows.Remove(row)
Next
我将看到消息框,但仅限于每隔一行。我认为正在发生的是,
gridFiles.Rows
的内部指针关闭了,因为在下一次迭代中,行数减少了1行

我需要遍历每一行,并有条件地决定是否删除它们(基于另一个操作的成功或失败)

我怎样才能避开这个问题

dim deleteList As new List(Of DataGridViewRow)
For Each row as DataGridViewRow in gridFiles.Rows
    MsgBox(row.Cells("somekey").Value.ToString)
    deleteList.Add(row)
Next
For Each row As DataGridViewRow in deleteList 
   gridFiles.Rows.Remove(row)
Next
或者,将集合向后评级

For i As Integer = gridFiles.Rows.Count - 1 To 0 Step -1
    MsgBox(row.Cells("somekey").Value.ToString)
    gridFiles.Rows.Remove(gridFiles.Rows(i))
End If
或者,将集合向后评级

For i As Integer = gridFiles.Rows.Count - 1 To 0 Step -1
    MsgBox(row.Cells("somekey").Value.ToString)
    gridFiles.Rows.Remove(gridFiles.Rows(i))
End If

当您迭代一个集合
gridFiles.Rows
并从该集合中删除时,会干扰该集合本身,并且迭代无法正常工作(foreach尝试获取下一个值,但索引已更改,因为该项已被删除),这给您留下了“每隔一次”的评估


解决方案(或解决方案,还有其他方法可以对其进行蒙皮)是将要删除的项放在自己的集合中,并放在foreach循环之后,循环遍历“itemsToBeRemoved”集合,并从原始集合中删除这些项。

当您在集合中迭代
gridFiles.Rows
并从该集合中删除时,会干扰集合本身,迭代无法正常工作(foreach尝试获取下一个值,但索引已更改,因为该项已被删除),这会给您留下“每隔一次”的评估


解决方案(或解决方案,还有其他方法可以对此进行蒙皮)是将要删除的项放在自己的集合中,然后在foreach循环之后,通过“itemsToBeRemoved”集合进行循环,并从原始集合中删除这些项。

:o)Magnus为我刚才解释的内容编写了一个很好的演示。我很惊讶没有抛出异常。序列中没有单独的命令本身是“坏的”。问题在于行动的顺序。如果你看Magnus提供的第二个例子,如果你不向后迭代,你会得到一个异常,因为
i
将超过实际索引。:o)Magnus编写了一个很好的演示我刚才解释的内容。我很惊讶没有抛出异常。序列中没有一个命令本身是“坏的”。问题在于行动的顺序。如果您查看Magnus提供的第二个示例,如果您不向后迭代,您将得到一个异常,因为
i
将超出实际索引。