Zugriff auf gelöschte Zeilen von einer DataTable

7

Ich habe ein übergeordnetes WinForm mit einem MyDataTable _dt als Mitglied. Der MyDataTable-Typ wurde in Visual Studio 2005 im Entwurfswerkzeug "typisierte Dataset" erstellt (MyDataTable erbt von DataTable) _dt wird von einer Datenbank über ADO.NET aufgefüllt. Aufgrund von Änderungen der Benutzerinteraktion im Formular lösche ich eine Zeile wie folgt aus der Tabelle:

_dt.FindBySomeKey(_someKey).Delete();

Später wird _dt als Wert an ein Dialogformular übergeben. Von dort aus muss ich alle Zeilen durchsuchen, um eine Zeichenfolge zu erstellen:

%Vor%

Das Problem ist, dass nach dem Löschen die folgende Ausnahme ausgelöst wird: DeletedRowInaccessibleException: Deleted row information cannot be accessed through the row.

Die Arbeit, die ich derzeit verwende (die sich wie ein Hack anfühlt) ist die folgende:

%Vor%

Meine Frage: Ist das der richtige Weg? Warum sollte die foreach-Schleife auf Zeilen zugreifen, die über die Delete() -Methode ?? /

Ken 26.04.2010, 14:19
quelle

5 Antworten

2

Sie müssen Folgendes überprüfen:

%Vor%

Ich denke, dass die Standardeinstellung keine gelöschten Zeilen anzeigt, vielleicht ändern Sie sie irgendwo.

Sie können immer eine zusätzliche RowView erstellen und deren Filter steuern und Ihre Schleife über die Ansicht machen.

    
Henk Holterman 26.04.2010, 14:26
quelle
14

Die Methode Delete markiert eine Zeile zum Löschen. Die Zeile wird erst entfernt, wenn Sie AcceptChanges aufrufen.

Rufen Sie stattdessen _dt.Rows.Remove(_dt.FindBySomeKey(_someKey)) auf, wodurch auch die Änderung akzeptiert wird.
Glauben Sie es oder nicht, Rows.Remove wird die Zeile komplett entfernen, während row.Delete() werde nicht .
Beachten Sie, dass die Zeile, wenn Sie Rows.Remove aufrufen, permanent gelöscht wird und nicht von einem DataAdapter aus der Datenbank gelöscht wird.

In C # 3 können Sie Ihre if -Anweisung durch die folgende Erweiterungsmethode ersetzen:

%Vor%

BEARBEITEN

Hier ist eine C # 2-Version:

%Vor%

Sie können diese Funktion auch in die partielle Klasse für die typisierte Tabelle einfügen:

%Vor%     
SLaks 26.04.2010 14:23
quelle
2

Was Sie tun, um die Zeilen in Ihrer Iteration zu überspringen, ist korrekt. Ich überprüfe routinemäßig den RowState, wenn ich über eine DataTable, die geändert werden kann, eine Schleife führe.

In einigen Fällen glaube ich, dass Sie den ursprünglichen Zeilenwert haben möchten, bevor die Zeile als gelöscht markiert wurde. Beim Abrufen eines bestimmten Datenzeilenwerts gibt es eine sekundäre Indexoption.

%Vor%

Ich habe mich in der Vergangenheit immer wieder daran gehalten.

Was die GetChanges (RowState) -Methode betrifft, vergessen Sie nicht, nach einer Nullrückgabe zu suchen. Wenn es keine Zeilen dieses RowState gibt, ist die zurückgegebene DataTable null (ich denke, sie sollte eine Tabelle mit zurückgeben Null Zeilen)

    
DragonZero 03.11.2012 13:08
quelle
1

Verwenden Sie GetChanges ():

%Vor%

Wenn Sie alle hinzugefügt und geändert werden möchten, verwenden Sie bitweise ODER bei Hinzugefügte und geänderte:

%Vor%     
Michael Buen 26.04.2010 14:54
quelle
0

Ich bin mir nicht sicher, aber ich denke, wenn Sie _dt.AcceptChanges() nach dem Löschen einer oder mehrerer Zeilen aufrufen, werden Sie die gelöschten Zeilen nicht "sehen", wenn Sie die Rows-Sammlung der Datentabellen durchlaufen.

    
MusiGenesis 26.04.2010 14:30
quelle

Tags und Links