2011-06-13 26 views
1

假設我有一個名爲gridFiles的DataGridView。在DataGridViewRow上使用Remove移除每隔一行其他行

For Each row as DataGridView in gridFiles.Rows 
    MsgBox(row.Cells("somekey").Value.ToString) 
    gridFiles.Rows.Remove(row) 
Next 

我會看到消息框,但只能看到每隔一行。我認爲發生的事情是gridFiles.Rows的內部指針下降,因爲在下一次迭代中只有1行。

我需要迭代每一行,並有條件地決定是否刪除它們(基於另一個操作的成功或失敗)。

我該如何解決這個問題?

回答

2

當你通過一個集合gridFiles.Rows迭代,並從該集合你打擾集合本身和迭代並不像它應該(嘗試的foreach工作刪除獲取下一個值,但由於已刪除的項目,索引已經更改)留下一個'所有其他'評估。

解決方案(或者一種解決方案,還有其他的方法可以用來解決這個問題)就是將要移除的項目放在自己的集合中,並且在您的foreach循環之後,循環遍歷'itemsToBeRemoved'集合,並將這些項目從原始集合。

+0

:o)馬格努斯寫了一個很好的演示,我剛剛解釋過。 – 2011-06-13 21:07:57

+0

我很驚訝沒有拋出異常。 – 2011-06-14 18:26:06

+0

序列中沒有單獨的命令本身是「壞」的。問題在於操作順序。如果你看看Magnus提供的第二個例子,如果你不向後迭代,你會得到一個異常,因爲'i'將會超過實際的索引。 – 2011-06-15 02:39:48

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 

或者,itterate收集向後

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 
相關問題