[c#] setvalue dans un array

Résolu
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

  1. 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
    1. 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
      1. 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
      2. 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