Sicheres Entfernen von DataRow In FürJeden
-
22-09-2019 - |
Frage
Ich verstehe nicht, warum dieser Code nicht funktioniert.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
Lösung
Andere Tipps
Sicherste Weg - Verwendung for
Schleife
for (int i = datatable.Rows.Count - 1; i >= 0; i--)
{
if (true)
{
datatable.Rows[i].Delete();
}
}
Vergessen Sie nicht zu AcceptChanges
alle markierten Zeilen zu entfernen:
datatable.AcceptChanges();
Sie können eine Sammlung ändern, während Sie Iterieren sind auf eine foreach
Anweisung.
Sie können so etwas versuchen:
List<DataRow> deletedRows = new List<DataRow>();
foreach (DataRow dataRow in dataTable.Rows)
{
if(true) deletedRows.Add(dataRow);
}
foreach(DataRow dataRow in deletedRows)
{
dataRow.Delete();
}
Wenn Sie die Löschmethode rufen Sie müssen nur AcceptChanges()
auf den Tisch rufen Sie ändern, nachdem der foreach-Schleife.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
Die Löschmethode einfach markiert die Zeile zum Löschen.
http: //msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=VS.90%29.aspx
kann meine Antwort nicht mehr nützlich sein. Ausnahme throw in Foreach mit DataRow erscheint nur in .NET 2.0 und früher, der Grund ist, Beschreibung bei Msdn http: // msdn. microsoft.com/en-us/library/system.data.datarow.delete(v=vs.80).aspx
Wenn die RowState der Zeile hinzugefügt wird, die Zeile aus der Tabelle entfernt wird.
Die RowState werden gelöscht, nachdem Sie die Delete-Methode verwenden. Es bleibt Deleted bis AcceptChanges nennen.
A gelöschte Zeile kann durch Aufruf RejectChanges gestellt werden.
Um dieses Problem zu übergeben Sie DataTable.AcceptChanges () vor der Verwendung foreach anrufen
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
Bitte beachten Sie die Druckknöpfe der Arbeits davon understatnd.
- Just gelöscht, aber nicht aus der Datentabelle entfernt.
- Break Punkt vor AcceptChanges () Funktion.
- Nach Eexecuting AcceptChanges () Funktion.
Ich hoffe, dieses Problem behoben jetzt.
Der Rows
Inhalt ändert, während Sie Iterieren sind, wenn Sie eine Zeile löschen, die die Iteration ungültig macht.
Sie können jedoch, kopieren Sie die Zeilen in einer Sammlung zuerst und dann die Sammlung iterieren und löschen Sie die Zeilen auf diese Weise. Dies stellt sicher, dass die Iteration nicht durch Ändern von Daten unterbrochen wird, wiederholt werden.
Der einfachste Weg, dies zu erreichen, indem er eine Liste mit Zeilen, die Sie zuordnen möchten, löschen und dann löschen Zeilen außerhalb Table Iteration.
C #
List<DataRow> rowsWantToDelete= new List<DataRow>();
foreach (DataRow dr in dt.Rows)
{
if(/*Your condition*/)
{
rowsWantToDelete.Add(dr);
}
}
foreach(DataRow dr in rowsWantToDelete)
{
dt.Rows.Remove(dr);
}
VB
Dim rowsWantToDelete As New List(Of DataRow)
For Each dr As DataRow In dt
If 'Your condition' Then
rowsWantToDelete .Add(dr)
End If
Next
For Each dr As DataRow In rowsWantToDelete
dt.Rows.Remove(dr)
Next
Es gibt eine andere Version davon (ich glaube, ein leichteres), was ich gerade verwendet:
int i=0;
while (i < myDataTable.Rows.Count)
{
if (condition) //should it be deleted?
myDataTable.Rows.RemoveAt(i);
else
i++;
}
Diese schneller.
Nur für Leute, die auf der Suche nach bestimmten Szenario wie ich, Ich brauchte Zeit, um zu verkürzen, und einmal einige nützlichen Infomationen aus jeder Zeile extrahiert, ich schloss die Reihe durch die Markierung als gelöscht.
Hope diese Hilfe jemand ...
foreach (DataRow dataRow in dataTable.Rows)
{
if (dataRow.RowState != DataRowState.Deleted)
{
if (your condition here)
{
dataRow.Delete();
}
}
}
Dies gilt für so ziemlich jede Sammlung. Wenn Sie versuchen, ein Element zu löschen, während durch die Sammlung Looping, werden Sie ein Problem haben. Zum Beispiel, wenn Sie Zeile löschen # 3, dann ist die vorhergehende Zeile # 4 wird Zeile # 3.
Wo Artikel im Count
haben, ist es das, was ich getan habe:
int Count = myTable.Rows.Count;
while (Count > 0) // replace condition with myTable.Rows.Count if unconditionally performed on all rows
{
DataRow row = myTable.Rows[0] // or however you want to find your index
// do some work
myTable.Rows.Remove(row);
// if you want to perform a check to break out of while
if (someCondition)
Count = 0;
else
Count = myTable.Rows.Count;
}
Beachten Sie, dass dort, wo Objekte eine .GetXXXX()
Sammlung, wie FileInfo
(IIRC),
Gegenstand Inhalt in einem foreach
Löschen ist akzeptabel. Eine Lösung, die ich in Betracht gezogen habe, ist eine Erweiterungsmethode zu schaffen, die ein .GetItems()
Verfahren liefert.
Verwenden Sie diese:
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
myDataTable[i].Delete();
}
Das ist, weil es wie Versuch sieht die Treppe auf der Treppe zu zerlegen, dass Sie klettern. Einfach gesagt, können Sie nicht ein Element entfernen Sie Iterierte.
Daher sollten Sie verschiedene Array zu durchlaufen benutzen und entfernen Sie sie aus Datentabelle Rows
Eigenschaft.
foreach (DataRow dataRow in dataTable.Select())
{
if (true)
{
dataTable.Rows.Remove(dataRow);
}
}
Sure Magents
Dies ist, wie ich es getan hätte und funktioniert
dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
if (dt.Rows[c - x]["DQTY"].ToString() == "0")
{
dt.Rows[c - x].Delete();
dt.AcceptChanges();
x++;
}
}