Szukam prostego sposobu na utworzenie klonu DataRow. Coś jak zrobienie migawki tego rzędu i zapisanie go. Wartości oryginalnego wiersza można następnie zmienić, ale nadal mamy inną zapisaną kopię, która się nie zmienia. Czy to jest właściwy sposób?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
Czy spowoduje to ustawienie odniesienia ItemArray w Snapshot tak, aby wskazywało na ten w źródle, czy faktycznie tworzy oddzielną kopię? Powinienem to zrobić zamiast tego?
Destination.ItemArray = Source.ItemArray.Clone();
EDYCJA: Nie sądzę, aby drugi fragment kodu faktycznie się kompilował.
Odpowiedzi:
Możesz użyć
ImportRow
metody, aby skopiować wiersz z DataTable do DataTable z tym samym schematem:Aktualizacja:
Wierzę, że dzięki Twojej nowej edycji:
będzie działać
źródło
destRow.ItemArray = sourceRow.ItemArray
następnie proste dodanie wiersza z powrotem za pomocądestTable.Rows.Add(destRow);
Uwaga: pomocna odpowiedź Cuongle zawiera wszystkie składniki, ale rozwiązanie można usprawnić (nie ma potrzeby
.ItemArray
) i można je przeformułować, aby lepiej dopasować zadane pytanie.Aby utworzyć (izolowany) klon danej
System.Data.DataRow
instancji , możesz wykonać następujące czynności:Uwaga: Wykonywane jest płytkie klonowanie , które działa tak jak jest z wartościami kolumn, które są instancjami typu wartości , ale potrzeba więcej pracy, aby również utworzyć niezależne kopie wartości kolumn zawierających instancje typu referencyjnego (a tworzenie takich niezależnych kopii nie zawsze jest możliwe ).
źródło
Wygląda na to, że nie chcesz zachować całego DataTable jako kopii, ponieważ potrzebujesz tylko kilku wierszy, prawda? Jeśli masz kreterię, którą możesz określić za pomocą zaznaczenia w tabeli, możesz skopiować tylko te wiersze do dodatkowej kopii zapasowej tablicy DataRow, takiej jak
Funkcja .Select () ma kilka opcji, a tę można np. Odczytać jako SQL
Następnie możesz zaimportować żądane wiersze, jak opisano powyżej.
... dla dowolnego poprawnego n, które chcesz, ale kolumny muszą być takie same w każdej tabeli.
Kilka rzeczy, które powinieneś wiedzieć o ImportRow, to fakt, że podczas używania kluczy podstawowych będą występować błędy!
Najpierw chciałem sprawdzić, czy istnieje już wiersz, który również nie powiódł się z powodu braku klucza podstawowego, ale potem sprawdzenie zawsze kończyło się niepowodzeniem. W końcu zdecydowałem się całkowicie wyczyścić istniejące wiersze i ponownie zaimportować te, które chciałem.
Druga kwestia pomogła zrozumieć, co się dzieje. Sposób, w jaki używam funkcji importu, polega na duplikowaniu wierszy z wymienionym wpisem w jednej kolumnie. Zdałem sobie sprawę, że zawsze się to zmieniało i nadal było to odniesienie do wiersza w tablicy. Najpierw musiałem zaimportować oryginał, a następnie zmienić wpis, który chciałem.
W odwołaniu wyjaśniono również błędy klucza podstawowego, które pojawiły się, gdy po raz pierwszy próbowałem zaimportować wiersz, ponieważ naprawdę został podwojony.
źródło
Aby jednak upewnić się, że nowy wiersz jest dostępny w nowej tabeli, musisz zamknąć tabelę:
źródło
DataTable destination = source.Clone()
powinien zrobić), ale poza tym ta odpowiedź jest całkowicie w porządku, a nawet lepsza niż.ItemArray
podejście w zaakceptowanej odpowiedzi.