Ich suche nach einer einfachen Möglichkeit, einen Klon einer DataRow zu erstellen. Ein bisschen wie ein Schnappschuss dieser Zeile zu machen und sie zu speichern. Die Werte der ursprünglichen Zeile können dann geändert werden, aber wir haben noch eine andere gespeicherte Kopie, die sich nicht ändert. Ist das der richtige Weg?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
Wird dadurch nur die ItemArray-Referenz von Snapshot so eingestellt, dass sie auf die in Source verweist, oder wird tatsächlich eine separate Kopie erstellt? Soll ich das stattdessen tun?
Destination.ItemArray = Source.ItemArray.Clone();
EDIT: Ich glaube nicht, dass das zweite Code-Snippet tatsächlich kompiliert wird.
Antworten:
Sie können die
ImportRow
Methode verwenden, um die Zeile mit demselben Schema von DataTable nach DataTable zu kopieren:Aktualisieren:
Mit Ihrer neuen Bearbeitung glaube ich:
wird funktionieren
quelle
destRow.ItemArray = sourceRow.ItemArray
Fügen Sie dann einfach die Zeile mit hinzudestTable.Rows.Add(destRow);
Hinweis: Die Antwort von cuongle enthält alle Zutaten, aber die Lösung kann optimiert werden (keine Notwendigkeit
.ItemArray
) und kann neu formuliert werden, um der gestellten Frage besser zu entsprechen.Um einen (isolierten) Klon einer bestimmten
System.Data.DataRow
Instanz zu erstellen , haben Sie folgende Möglichkeiten:Hinweis: Shallow Klonen durchgeführt wird , die arbeitet , wie sie ist mit Spaltenwerte, die Werttyp - Instanzen, aber mehr Arbeit würde auch unabhängige Kopien von Spaltenwerten zu erstellen benötigt werden , um Referenztyp - Instanzen (und die Schaffung einer solchen unabhängige Kopien ist nicht immer möglich ).
quelle
Anscheinend möchten Sie nicht die gesamte DataTable als Kopie behalten, da Sie nur einige Zeilen benötigen, oder? Wenn Sie eine Kreteria haben, die Sie mit einer Auswahl in der Tabelle angeben können, können Sie nur diese Zeilen in ein zusätzliches Sicherungsarray von DataRow wie kopieren
Die .Select () -Funktion hat mehrere Optionen und diese kann zB als SQL gelesen werden
Anschließend können Sie die gewünschten Zeilen wie oben beschrieben importieren.
... für jedes gültige n, das Sie mögen, aber die Spalten müssen in jeder Tabelle gleich sein.
Einige Dinge, die Sie über ImportRow wissen sollten, sind, dass es zur Laufzeit Fehler bei der Verwendung von Primärschlüsseln gibt!
Zuerst wollte ich überprüfen, ob bereits eine Zeile vorhanden war, die ebenfalls aufgrund eines fehlenden Primärschlüssels fehlschlug, aber dann schlug die Überprüfung immer fehl. Am Ende habe ich beschlossen, die vorhandenen Zeilen vollständig zu löschen und die gewünschten Zeilen erneut zu importieren.
Das zweite Problem hat geholfen zu verstehen, was passiert. Ich verwende die Importfunktion, um Zeilen mit einem ausgetauschten Eintrag in einer Spalte zu duplizieren. Mir wurde klar, dass es sich immer geändert hat und immer noch ein Verweis auf die Zeile im Array ist. Ich musste zuerst das Original importieren und dann den gewünschten Eintrag ändern.
In der Referenz werden auch die Primärschlüsselfehler erläutert, die beim ersten Versuch, die Zeile zu importieren, aufgetreten sind, da sie tatsächlich verdoppelt wurde.
quelle
Um sicherzustellen, dass auf Ihre neue Zeile in der neuen Tabelle zugegriffen werden kann, müssen Sie die Tabelle schließen:
quelle
DataTable destination = source.Clone()
sollte tun), aber ansonsten ist diese Antwort vollkommen in Ordnung und sogar dem.ItemArray
Ansatz in der akzeptierten Antwort vorzuziehen .