Copier une Datarow autre que par référence

Signaler
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009
-
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009
-
Bonjour.

A un instant t, je souhaiterai sauvegarder une datarow (qui est dans un datagridview).

J'arrive à récupérer la datarow grâce à ce code :

DataRowView drv = (DataRowView)Dgv.Rows[e.RowIndex].DataBoundItem;
Dr = drv.Row;

Dr est la datarow à l'instant t. Je souhaiterai la sauvegarder dans une autre Datarow (nommée DrSave) pour faire des tests ultérieurement.

Pour cela je fais :

Datarow DrSave = Dr;

Seulement quand je fais ça il ne fait qu'une référence, et si Dr est modifié dans la gridview alors DrSave est aussi modifié.

Comment pourrais-je faire pour simplement copier cette datarow ?

Merci,

Alex.

2 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

En effet, il ne fait qu'une référence, donc DrSave et Dr sont le même objet (pas 2 objets identiques).

Il va donc te falloir créer une méthode qui permette de copier une à une les données de ton DataRow. Le problème est que, dans mes souvenirs, il n'est pas possible de créer un new DataRow();
Cependant, un DataRow correspond juste à un tableau d'objects

Tu peux donc faire quelque chose du genre :

object[] DrSave = new object[Dr.ItemArray.Length];

for (int i = 0; i < Dr.ItemArray.Length; i++)
{
DrSave[i] = Dr.ItemArray[i];
}

Logiquement (je n'ai pas testé), ça devrait marcher.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009

C'est ce que j'ai fais (enfin dans l'idée).

Il faut juste remplacer ta 1ère ligne parce quelque chose du style :

DrSave = Ds.Tables["matable"].NewRow();

(où Ds est mon Dataset) pour créer le schéma de la datarow, sinon tu ne peux pas manipuler le tableau de valeurs.

Après tu peux faire le for avec le tableau d'items pour recopier les valeurs.

Le but en fait était de vérifier si les lignes Dr et DrSave sont différents plus tard dans le programme en faisait :

if(Dr!=DrSave)

Seulement dans notre cas elles seront toujours différentes car seuls les valeurs sont identiques, mais toutes les petites propriétés des datarows n'ont pas été recopiés et certaines diffèrent.

Donc pour tester si les lignes sont identiques, j'ai crée la fonction suivante qui permet de vérifier que deux Datarow sont différentes en comparant les valeurs :

private bool CompareLesDr(DataRow Dr1, DataRow Dr2)
{//Permet de trouver des différences entre les datarow (on ne peut pas comparer directement les datarows car seuls les données sont recopiées et pas les propriétés par exemple donc elles seront toujours différentes)
//On parcourt toutes les données des datarow
for (int i = 0; i < Dr1.ItemArray.GetLength(0); i++)
{
if (Dr1[i].ToString() != Dr2[i].ToString()) //S'il y a une différence alors la fonction l'indique
return true; //Elle retourne vrai
}

return false; //Sinon elle retourne faux
}

Et ça fonctionne. Mais bon c'est du bricolage quand même.