Changer valeur item dans datatable

[Résolu]
Signaler
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Bonjour,

J'ai une datatable remplie par un query, cette DT est datasource d'un combo

J'essaye de changer la valeur d'un item de cette table

dtt.Rows[i].ItemArray[1] = addrID;

Je n'ai pas d'erreur, mais rien ne se passe
addrID est un int

Quelle est l'erreur ?

5 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Salut,

Plus précisément ItemArray n'est pas une "vue" mais plus une extraction des données "brutes" sous forme d'un tableau.
Bref :
dtt.Rows[i].ItemArray[1] =  addrID;
1) dtt.Rows[i] : obtention du DataRow
2) ...ItemArray : obtention du tableau
3) ...[1] =  addrID; : modification de la valeur dans le tableau

Et derrière, on ne fait rien du tableau, donc forcément.

Par contre dtt.Rows[i][1] =  addrID;
n'est rien d'autre que l'utilisation de la propriété Item, qui agit sur chaque valeur directement : on se sert du code de la classe DataRow, pas de celui de la classe Array.

Naturellement comme la propriété ItemArray est en lecture/écriture, et comme le dit la doc, elle peut quand même servir à la modification des valeurs.
Basiquement :
Object[] itemsArray = dtt.Rows[i].ItemArray;
itemsArray[0] = ...;
itemsArray[1] = addrID;
itemsArray[2] = ...;
...
dtt.Rows[i].ItemArray = itemsArray;

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Salut

Et bien non !
Pas tu tout

Ce que je disais c'est que quand j'essaye d'assigner  ma valeur

 dtt.Rows[i].ItemArray[1] =  addrID;

Rien ne se passait
En fait, l'erreur vient du mode d'adressage, en réalité pour VRAIMENT acceder à la valeur, il faut faire :

 dtt.Rows[i][1] =  addrID;

ItemArray n'est qu'une "vue" sur l'item ce n'est pas un pointeur sur celui-ci
AcceptChange ne doit intervenir que bien plus tard et selon moi APRES l'exploitation des changements sans un update pour precisément signaler que les changements ont été traités que l'on repart sur une situation fraiche
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
34
Salut,

Il faut peut que tu acceptes les modifications

dtt.AcceptChanges();

Ce mécanisme permet à la méthode Update
de savoir quelles lignes ont été modifiées et n'envoyée que c'est derniere en base de données
mais des fois si tu n'utilises pas le principe, il faut utilisée acceptChanges()

MSDN (quelques explications et tu as le rowstate pour expliquer aussi)

Bon courage
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
34
salut,

J'ai tenté et j'ai perdu c'est pas grave, du moment que tu es trouvé la solution.

Tu peux donc valider ton psot ;-)
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Ouais !

Bon a garder en tete

Mais c'est quand meme un peu tripoteux
L'intéret est sans doute limité a des cas un peu spéciaux.