[c#] setvalue dans un array

Résolu/Fermé
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 - Modifié par Laraannain le 4/11/2010 à 10:14
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 - 5 nov. 2010 à 09:23
Bonjour,

je me trouve face à un problème que je ne m'explique pas avec la fonction "setvalue"

voici mon code :

DataTable dat = _data;    
for (int i = 0; i < dat.Columns.Count; i++)    
{    
    dat.Rows[0].ItemArray.SetValue(infoPanel.Controls[2 * i + 1].Text,i);    
    MessageBox.Show(infoPanel.Controls[2 * i + 1].Text  
             + " : " +dat.Rows[0].ItemArray.GetValue(i).ToString());    
}


en gros je lui dit de mettre un élément "infoPanel.Controls[2 * i + 1].Text" à la place i.
puis je lui fais afficher
"infoPanel.Controls[2 * i + 1].Text : l'élément en position i"
et en l'occurence la fonction setvalue n'a rien fait puisque ces deux valeurs devraient être identiques et ne le sont pas.
Ai-je mal compris l'utilisation de la fonction setValue ?

merci :)

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
4 nov. 2010 à 10:21
Bonjour,

Le problème ne vient pas de SetValue, mais plutôt de ItemArray.
ItemArray n'est pas la ligne elle-même, mais une copie des données de la ligne mise dans un tableau.
Du coup, tu changes une valeur dans un tableau créé à la volée... mais pas dans ta DataTable / DataRow !

Pour changer la valeur dans ta DataRow, il faut accéder directement à son élément via son index.

Ton code devient donc :
                DataTable dat = _data;
                for (int i = 0; i < dat.Columns.Count; i++)
                {
                    dat.Rows[0][i] = infoPanel.Controls[2 * i + 1].Text;
                    MessageBox.Show(infoPanel.Controls[2 * i + 1].Text + " : " +dat.Rows[0].ItemArray.GetValue(i).ToString());
                }


(À l'affichage, j'ai laissé le ItemArray.[...] car pour le coup, ça ne donne pas de problème. Mais tu peux aussi utiliser directement dat.Rows[0][i].ToString() )

Xavier
0
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 15
4 nov. 2010 à 10:28
Et ça marche !

Je ne pensais pas qu'il s'agissait uniquement d'une copie des données. J'ai encore un peu de boulot pour maîtriser les DataTables moi ^^"

Merci beaucoup :)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 4/11/2010 à 10:35
En fait, tu pourrais résoudre ton problème en utilisant des ItemArray, comme ceci :
DataTable dat = _data;     
for (int i = 0; i < dat.Columns.Count; i++)     
{     
    Object[] unItemArray = dat.Rows[0].ItemArray; 
    unItemArray.SetValue(infoPanel.Controls[2 * i + 1].Text,i);     

    dat.Rows[0].ItemArray = unItemArray; 

    MessageBox.Show(infoPanel.Controls[2 * i + 1].Text   
             + " : " +dat.Rows[0].ItemArray.GetValue(i).ToString());     
}


Mais c'est plus lourd, car à chaque itération tu remplaces l'ensemble des valeurs de la ligne...
0
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 15
5 nov. 2010 à 09:23
ce serait en effet, un petit peu plus lourd, mon programme est déjà assez gros pour que j'évite de le ralentir un plus.

merci pour ton aide ;-)
0