Frage

Ich verstehe nicht, warum dieser Code nicht funktioniert.

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}
War es hilfreich?

Lösung

Auch wenn DataRow.Delete nicht den Zustand der Sammlung nicht ändern,

Andere Tipps

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.

  1. Just gelöscht, aber nicht aus der Datentabelle entfernt.

eingeben Bild Beschreibung hier

  1. Break Punkt vor AcceptChanges () Funktion. eingeben Bild Beschreibung hier
  2. Nach Eexecuting AcceptChanges () Funktion. eingeben Bild Beschreibung hier

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++;        
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top