在使用Remove的DataGridViewRow上的For Each期间,每隔一行都会点击

时间:2011-06-13 20:59:30

标签: .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。

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

如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

当您遍历集合gridFiles.Rows并从该集合中删除时,您会干扰集合本身,并且迭代不会像它应该的那样工作(foreach尝试获取下一个值,但索引因为已删除的项目)让您进行“每隔一次”评估。

解决方案(或者一个解决方案,还有其他方法可以去除它)是将要删除的项目放在自己的集合中,并在foreach循环之后循环遍历'itemsToBeRemoved'集合并从中删除这些项目原创藏品。