2010-06-30 28 views
11

tengo una tabla de datos y quiero eliminar una fila aquí es mi código que me está lanzando una excepcióntabla de datos + borrar una fila en C# usando bucle

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

incluso fuimos fuera del caso DECLARACIÓN y fuera forloop todavía me error lanza alguna idea de cómo lograr esta tarea esta es la excepción me sale:

Collection was modified; enumeration operation might not execute. 

final Código de trabajo:

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

} 
+1

posible duplicado de [Extracción segura DataRow En ParaCada] (http://stackoverflow.com/questions/2341580/safely-removing-datarow-in-foreach) – ChrisF

Respuesta

17

En lugar de utilizar dt1.Rows, utilice dt1.Select()

El objetivo aquí no es usar la colección en sí, sino más bien una matriz de fila que no es la colección Rows

+0

Trabajó exactamente como yo quería, gracias – Developer

+0

@Pierre: me salvaste, muchas gracias :) – Chiramisu

9

Cree una lista de filas para eliminar mientras itera sobre DataTable.Rows, luego elimínelas todas por separado. solución

no LINQ: solución

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:

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

Sé que es una muy buena respuesta, pero tengo para ir con la respuesta de Pierre porque creo que es fácil hacerlo. Realmente aprecio tu ayuda. – Developer

1

Así lo hice cuando me encontré con este problema.

  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 
Cuestiones relacionadas