Data Table + delete a row in c# using loop

I have a data table and I want to delete a row here is my code it’s throwing me an exception

foreach (DataRow row in dt1.Rows)
{
    if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook"))
    {
        row.Delete();
        dt1.AcceptChanges();
    }
}

I even tried outside the if statment and outside forloop still throws me error any idea how to achieve this task this is the exception I get:

Collection was modified; enumeration operation might not execute.

Final working Code:

foreach (DataRow row in dt1.Select())
{
    if ((row["Name"] == "Select a Lookbook") ||    (row["Name"] == "Create a new Lookbook"))
    {
        row.Delete();                                       
    }

}

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Instead of using dt1.Rows, use dt1.Select()

The goal here is not to use the collection itself, but rather an array of row that is not the Rows collection

Method 2

Create a list of rows to delete while iterating over DataTable.Rows, then delete them all separately.

Non-LINQ solution:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach (DataRow row in dt1.Rows)
{
    if ((row["Name"] == "Select a Lookbook") || 
        (row["Name"] == "Create a new Lookbook"))
    {
        rowsToDelete.Add(row);
    }
}
foreach (DataRow row in rowsToDelete)
{
    row.Delete();
}
dt1.AcceptChanges();

LINQ solution:

List<DataRow> rowsToDelete = dt1.Rows.AsEnumerable()
    .Where(row => (row["Name"] == "Select a Lookbook") || 
                  (row["Name"] == "Create a new Lookbook"))
    .Tolist();
foreach (DataRow row in rowsToDelete)
{
    row.Delete();
}
dt1.AcceptChanges();

Method 3

This is how I did it when I ran into this issue.

            Dim index As Integer = 0
            Dim count As Integer = resultsDT.Rows.Count - 1
            For i As Integer = 0 To count
                If resultsDT.Rows(index).Item("something") = "something" Then
                    resultsDT.Rows(index).Delete()
                    resultsDT.AcceptChanges()
                    index = index - 1
                End If

                index = index + 1
                i = i + 1
            Next


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x