Je recherche un moyen simple de créer un clone d'un DataRow. Un peu comme prendre un instantané de cette ligne et l'enregistrer. Les valeurs de Row d'origine sont alors libres de changer mais nous avons encore une autre copie enregistrée qui ne change pas. Est-ce la bonne façon de procéder?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
Cela va-t-il simplement définir la référence ItemArray de Snapshot pour pointer vers celui de Source ou fait-il réellement une copie séparée? Dois-je faire cela à la place?
Destination.ItemArray = Source.ItemArray.Clone();
EDIT: Je ne pense pas que le deuxième extrait de code se compile réellement.
Réponses:
Vous pouvez utiliser la
ImportRow
méthode pour copier Row de DataTable vers DataTable avec le même schéma:Mettre à jour:
Avec votre nouvelle édition, je crois:
marchera
la source
destRow.ItemArray = sourceRow.ItemArray
puis rajoutez simplement la ligne avecdestTable.Rows.Add(destRow);
Remarque: la réponse helfpul de cuongle contient tous les ingrédients, mais la solution peut être simplifiée (pas besoin
.ItemArray
) et peut être recadrée pour mieux correspondre à la question posée.Pour créer un clone (isolé) d'une
System.Data.DataRow
instance donnée , vous pouvez effectuer les opérations suivantes:Remarque: le clonage superficiel est effectué , qui fonctionne tel quel avec les valeurs de colonne qui sont des instances de type valeur , mais plus de travail serait nécessaire pour créer également des copies indépendantes des valeurs de colonne contenant des instances de type référence (et la création de telles copies indépendantes n'est pas toujours possible ).
la source
Il semble que vous ne souhaitiez pas conserver l'intégralité de DataTable en tant que copie, car vous n'avez besoin que de quelques lignes, non? Si vous avez un critère que vous pouvez spécifier avec une sélection sur la table, vous pouvez copier uniquement ces lignes dans un tableau de sauvegarde supplémentaire de DataRow comme
La fonction .Select () a plusieurs options et celle-ci peut par exemple être lue comme un SQL
Ensuite, vous pouvez importer les lignes souhaitées comme décrit ci-dessus.
... pour tout n valide que vous aimez, mais les colonnes doivent être les mêmes dans chaque table.
Certaines choses que vous devez savoir sur ImportRow sont qu'il y aura des erreurs lors de l'exécution lors de l'utilisation de clés primaires!
Tout d'abord, je voulais vérifier s'il existait déjà une ligne qui a également échoué en raison d'une clé primaire manquante, mais la vérification a toujours échoué. En fin de compte, j'ai décidé d'effacer complètement les lignes existantes et d'importer à nouveau les lignes que je voulais.
Le deuxième problème a aidé à comprendre ce qui se passe. La façon dont j'utilise la fonction d'importation est de dupliquer des lignes avec une entrée échangée dans une colonne. J'ai réalisé que cela changeait toujours et que c'était toujours une référence à la ligne dans le tableau. J'ai d'abord dû importer l'original, puis modifier l'entrée que je voulais.
La référence explique également les erreurs de clé primaire qui sont apparues lorsque j'ai essayé d'importer la ligne pour la première fois car elle était vraiment doublée.
la source
Mais pour vous assurer que votre nouvelle ligne est accessible dans la nouvelle table, vous devez fermer la table:
la source
DataTable destination = source.Clone()
devrait faire), mais sinon cette réponse est parfaitement correcte et même préférable à l'.ItemArray
approche de la réponse acceptée.