2010-06-30 6 views
11

ich eine Datentabelle und ich möchte hier eine Zeile löschen, ist mein Code es mir eine Ausnahme ist das WerfenDatentabelle + eine Zeile in C# löschen mit Schleife

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

ich auch außerhalb der, wenn statment versucht und außerhalb forloop wirft mir immer noch keine Ahnung, Fehler, wie diese Aufgabe zu erreichen, dies ist die Ausnahme, die ich erhalten:

Collection was modified; enumeration operation might not execute. 

Abschlussarbeits Code:

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

} 
+1

möglich Duplikat [Sicheres DataRow In FürJeden Entfernen] (http://stackoverflow.com/questions/2341580/safely-removing-datarow-in-foreach) – ChrisF

Antwort

17

Statt dt1.Rows zu verwenden, verwenden dt1.Select()

Das Ziel ist nicht, die Sammlung zu verwenden selbst, sondern ein Array der Reihe, die nicht die Rows Ansammlung

ist
+0

Arbeitete genau so, wie ich wollte, Danke – Developer

+0

@Pierre: Du hast mich gerettet, vielen Dank :) – Chiramisu

9

Erstellen Sie eine Liste mit zu löschenden Zeilen, während Sie über DataTable.Rows iterieren, und löschen Sie sie dann alle separat.

Non-LINQ-Lösung:

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 Lösung:

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(); 
+0

Ich weiß, es ist eine sehr gute Antwort, aber ich habe mit Pierre's Antwort zu gehen, da ich glaube, dass es einfach ist. Ich schätze deine Hilfe sehr. – Developer

1

So habe ich es gemacht, als ich auf dieses Problem stieß.

  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 
Verwandte Themen