Den Zugriff auf gelöschte Zeilen aus der DataTable
Ich habe ein Elternteil WinForm, dass eine MyDataTable _dt
als Mitglied. Die MyDataTable Art wurde in der "typed dataset" designer-tool in Visual Studio 2005 (MyDataTable erbt von DataTable) _dt
wird bevölkert von einer db über ADO.NET. Basierend auf den änderungen von Benutzer-Interaktion in form lösche ich eine Zeile aus der Tabelle etwa so:
_dt.FindBySomeKey(_someKey).Delete();
Später _dt
durch Wert übergeben wird, um ein dialog-Formular. Von dort aus, muss ich Scannen durch alle Zeilen erstellen Sie eine Zeichenfolge:
foreach (myDataTableRow row in _dt)
{
sbFilter.Append("'" + row.info + "',");
}
Das problem ist, dass nach dem tun dies nach einem löschen, wird die folgende Ausnahme ausgelöst:
DeletedRowInaccessibleException: Deleted row information cannot be accessed through the row.
Die Arbeit, die ich bin derzeit mit (fühlt sich an wie ein hack), ist die folgende:
foreach (myDataTableRow row in _dt)
{
if (row.RowState != DataRowState.Deleted &&
row.RowState != DataRowState.Detached)
{
sbFilter.Append("'" + row.info + "',");
}
}
Meine Frage: Ist das der richtige Weg, dies zu tun? Warum würde die foreach-Schleife zugreifen Zeilen, die markiert wurden, über die Delete()
Methode??
- Sie nicht brauchen, um zu überprüfen, für
Detached
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie überprüfen:
Ich denke, dass die default-Einstellung wird nicht angezeigt, gelöschte Zeilen, vielleicht ändern Sie es irgendwo.
Können Sie immer erstellen Sie eine zusätzliche RowView und Steuerung der filter, und führen Sie Ihre Schleife in den Blick.
foreach (DataRowView row in _dt.DefaultView ) { sbFilter.Append("'" + ((myDataTableRow)row.Row).info+ "',"); }
alle Optionen angeboten, ich denke, das ist der sauberste Weg. Danke!Den
Delete
Methode markiert eine Zeile löschen, die Zeile ist eigentlich nicht entfernt, bis Sie rufenAcceptChanges
.Stattdessen rufen
_dt.Rows.Remove(_dt.FindBySomeKey(_someKey))
, die auch die änderung zu übernehmen.Ob Sie es glauben oder nicht,
Zeilen.Entfernen
wird komplett entfernen Sie die Zeile, in der Erwägung, dassrow.Delete()
nicht.Beachten Sie, dass wenn Sie anrufen
Rows.Remove
werden, wird die Zeile dauerhaft verschwunden, und wird nicht aus der Datenbank gelöscht werden durch einen DataAdapter.In C# 3, können Sie ersetzen Sie Ihren
if
- Anweisung mit der folgenden extension Methode:BEARBEITEN
Hier ist ein C# 2 version:
Könnten Sie auch diese Funktion in der partiellen Klasse für die typisierte Tabelle:
Update
nicht zu löschen es. Versuchen Sie es.Was Sie tun, um ein überspringen der Zeilen in der iteration ist richtig, ich regelmäßig überprüfen, ob die RowState-wenn ich die Loop-Schleife über eine DataTable, die verändert werden können.
In einigen Fällen, die ich glauben, Sie wollen die ursprüngliche Zeile mit dem Wert, bevor die Zeile als gelöscht markiert. Es ist ein Sekundär-index-option beim abrufen ein bestimmtes datarow-Wert.
Habe ich bekommen, stecken das man mehrere Male in der Vergangenheit.
Soweit die GetChanges(RowState) - Methode betroffen ist, vergessen Sie nicht zu überprüfen, ob ein null zurück, wenn keine Zeilen, die RowState -, DataTable zurückgegeben wird null (ich denke, es sollte die Rückkehr einer Tabelle mit null Zeilen)
Verwenden GetChanges():
Wenn Sie wollen, um alle Hinzugefügt und geändert werden, verwenden Sie bitweise ODER Hinzugefügt und Geändert:
Ich bin mir nicht sicher, aber ich denke, wenn Sie anrufen
_dt.AcceptChanges()
nach dem löschen eine oder mehrere Zeilen, die Sie nicht "sehen" gelöschte Zeilen beim Durchlaufen der Daten-Tabellen die Zeilen-Sammlung.