La guía o código que verás en este post es la resolución más fácil y efectiva que encontramos a esta inquietud o problema.
Solución:
Si elimina un elemento de una colección, esa colección ha cambiado y no puede continuar enumerando a través de ella.
En su lugar, use un bucle For, como:
for(int i = dtPerson.Rows.Count-1; i >= 0; i--)
DataRow dr = dtPerson.Rows[i];
if (dr["name"] == "Joe")
dr.Delete();
dtPerson.AcceptChanges();
Tenga en cuenta que está iterando a la inversa para evitar omitir una fila después de eliminar el índice actual.
Antes de que todos salten en el ‘No puede eliminar filas en una enumeración‘ carro, primero debe darse cuenta de que DataTables son transaccionaly técnicamente no purgue los cambios hasta que llame Aceptar cambios ()
Si ve esta excepción mientras llama Borrarusted está ya en un estado de datos de cambios pendientes. Por ejemplo, si acaba de cargar desde la base de datos, llamar a Delete arrojaría una excepción si estuviera dentro de un bucle foreach.
¡PERO! ¡PERO!
Si carga filas de la base de datos y llama a la función ‘Aceptar cambios ()‘ confirmas todos esos cambios pendientes en DataTable. Ahora puede iterar a través de la lista de filas llamando a Delete() sin preocuparse en el mundo, porque simplemente marca la fila para la eliminación, pero no se confirma hasta que usted otra vez llamar Aceptar cambios ()
Me doy cuenta de que esta respuesta está un poco anticuada, pero tuve que lidiar con un problema similar recientemente y espero que esto ahorre algo de dolor para un futuro desarrollador que trabaja en un código de 10 años 🙂
Ps Aquí hay un ejemplo de código simple agregado por Jeff:
C#
YourDataTable.AcceptChanges();
foreach (DataRow row in YourDataTable.Rows)
// If this row is offensive then
row.Delete();
YourDataTable.AcceptChanges();
VB.Net
ds.Tables(0).AcceptChanges()
For Each row In ds.Tables(0).Rows
ds.Tables(0).Rows(counter).Delete()
counter += 1
Next
ds.Tables(0).AcceptChanges()
con esta solución:
for(int i = dtPerson.Rows.Count-1; i >= 0; i--)
DataRow dr = dtPerson.Rows[i];
if (dr["name"] == "Joe")
dr.Delete();
si va a utilizar la tabla de datos después de eliminar la fila, obtendrá un error. Entonces, lo que puedes hacer es: reemplazar dr.Delete();
con dtPerson.Rows.Remove(dr);
Valoraciones y reseñas
Te invitamos a añadir valor a nuestro contenido informacional colaborando tu veteranía en las aclaraciones.