StrataFrame Forum

How to delete items from a DataTable during an enumeration

http://forum.strataframe.net/Topic6314.aspx

By Greg McGuffey - 1/26/2007

I'm trying to enumerate all the rows in a DataTable and if a certain condition is met, delete the current row. .NET doesn't like this:





Dim myTable As DataTable

'...fill table, two columns a string and an integer

For Each myRow As DataRow In myTable.Rows

If myRow.Item(1) = 34 Then

myTable.Delete(myRow)

End If

Next





It bombs when the Next statement hits. Is there another way to do this?
By Trent L. Taylor - 1/26/2007

It is because you are changing the contents of the value being enumerated.  You can't do this.  Just create an array or list that has all of the rows that you want to delete inside of the loop.  Then create another loop that cycles through the array you created to actually delete the rows.
By Greg McGuffey - 1/26/2007

Thanks for the help. While implementing what you suggestion, I noticed that the DataRow has a Delete method...then I noticed an AcceptChanges property on the DataTable. I tried this and it works:





Dim myTable As DataTable

'...fill table, two columns a string and an integer

For Each myRow As DataRow In myTable.Rows

If myRow.Item(1) = 34 Then

myRow.Delete()

End If

Next

myTable.AcceptChanges







Apparently, the Delete() method of the row just marks it for deletion (thus doesn't whack the enumeration). The AcceptChanges property actually removes the rows.
By Trent L. Taylor - 1/26/2007

This has nothing to do with data tables, but rather any type of collection in .NET.  If you had tried removing items from a collection inside of a loop you would have had the same issue.
By Greg McGuffey - 1/26/2007

Got it. I think the DataRow.Delete() works because it doesn't remove the item from the collection until you AcceptChanges, which I'm doing after the enum.
By Trent L. Taylor - 1/27/2007

Good. Smile