Mise à jour Dataset depuis dataGridView + rowFilter
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008
-
22 févr. 2008 à 09:43
Arthenius -
16 sept. 2008 à 18:15
Bonjour !
J'ai beau chercher je ne parviens pas à trouver une solution à mon problème et j'espère que quelqu'un pourra "lairer ma lanterne.
J'ai un dataGridView dont le dataSource est lié à un dataSet.
Lorsque j'effectue des modifications directement dans le dataSet le dataGridView est automatiquement mis à jour.
Par contre lorsque j'effectue des modifictations dans le dataGridView le dataSet ne prend pas directement en compte les modifs.
Je m'explique.
La table liée au dataGridView contient une colonne avc une valeur booléenne.
Admettons que j'ajoute un rowFilter sur mon dataSet pour ne filtrer que les lignes ayant une valeur = 1. Le dataGridView est bien mis à jour avec uniquement les lignes ayant la valeur 1. Par contre si je met ma valeur à 0 pour une ligne du dataGridView et valide, la ligne ne disparait que quand elle perd le focus. J'aimerais savoir comment forcer la mise à jour du dataSet sur base du dataGridView afin que le dataGridView soit mis à jour directement en tenant compte du rowFilter et que cette ligne disparaisse.
J'espère avoir été clair.
Un grand merci d'avance...
@"#+++
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 25 févr. 2008 à 09:53
Salut !!
J'essaierai la méthode getchanges() quand j'aurai le temps.
Je vois que tu parles d'une manière plus simple? Quelle est-elle ?7
Voici comment j'ai procédé pour résourde mon problème. J'ai modifié mes lignes directement dans le dataSet. Le dataGridView est alors mis à jour automatiquement.
J'utilise la syntaxe suivante : votreDataSet.findByPrimaryKey(Clé à chercher)["Nom de la colonne"] = ...
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 17 mars 2008 à 07:31
Salut
Ayant acquis un peu d'expérience, voici ce que je te conseille
Quand tu connais le DataGridRowView que tu veux modifier, tu accede le row lié dans la datatable par le databounditem et tu fais la modif dessus, elle sera repercutéee dans le datarowview et le change sera bien triggé
Voici un exemple
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 17 mars 2008 à 09:57
Bonjour !
Merci pour vos réponses !
Pour une suppression de record la technique que j'ai évoquée ci dessus (modification directe dans le dataset) fonctionne correctememnt.
Toutefois pour une modification de record je rencontre des problèmes. Lors de l'update de la BDD sur base du dataset, tous les champs modifiés ne sont pas pris en compte bien que le dataset soit correct (visualisé en debug). Comment est-ce possible ?
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 17 mars 2008 à 10:28
Bonjour
Tous les champs ?
Tu veux dire que certains champs modifiés dans un record sont pris et pas d'autres
ou que certains records sont pris et pas d'autres
Quelle est ta commande d'update
Comment tu la génère ?
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 18 mars 2008 à 22:36
En réalité seul un champ de type string est éditable dans mon datagridview, ce dernier étant lié à un dataset.
J'utilise la méthode update générée auto par le builder visualstudio. Je debug et juste avant l'update je visualise le dataset qui a pris les bonnes valeurs après éditions mais ma bdd n'est pas mise à jour correctement.
Tu as déjà eu ce problème ?
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 18 mars 2008 à 22:48
Ce que j'ai déja eu c'est qu'apres avoir modifié les champs dans le DGV par programmation, le rowstate (je ne me souviens plus du nom exact) etait resté unchanged et je devais le forcer modifié
C'est pour ca que je fais maintenant directement les modifications dans la datatable PAS le DGV
Maintenant si tu fais un getchange tu peux voir les rows qui seront pris dans l'update
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 26 mars 2008 à 15:51
Bon j'ai utilisé la méthode getChanges afin de voir s'il prenait les modifications en cours ou pas et malheureusement ce n'est pas le cas !
Pour rappel j'ai un dataset lié à un DGV (via dataSource). J'aimerais que lorsque j'effectue un edit dans mon DGV celui-ci soit répercuté dans mon dataset également et dans la BDD lors de l'update.
Voici la solution qui marche à tous les coups.
J'édite mes valeurs dans le datagridView normalement.
Je récupère l'évenement endEdit du DGV au cours duquel j'effectue les choses suivantes :
+Récupération de la nouvelle valeur après édition dans la cellule sélectionnée du DGV
+Récupération de la clé unique pour le reperage dans le dataset
+Annulation de l'édition dans le DGV pour éviter les conflits dus à la liaison du dataset au DGV par dataSource.
+Mise à jour directement dans le dataset avec la nouvelle valeur. Le record à modifié est trouvé grâce à la méthode Dataset.findVotreClePrimaire(...
Les modifications appliquées dans le Dataset se répercuteront dans le DGV puisqu'ils sont liés.
Utiliser alors la méthode Update pour mettre à jour la Bdd.
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 26 mars 2008 à 16:18
Voici la solution qui marche à tous les coups.
J'édite mes valeurs dans le datagridView normalement.
Je récupère l'évenement endEdit du DGV au cours duquel j'effectue les choses suivantes :
+Récupération de la nouvelle valeur après édition dans la cellule sélectionnée du DGV
+Récupération de la clé unique pour le reperage dans le dataset
+Annulation de l'édition dans le DGV pour éviter les conflits dus à la liaison du dataset au DGV par dataSource.
+Mise à jour directement dans le dataset avec la nouvelle valeur. Le record à modifié est trouvé grâce à la méthode Dataset.findVotreClePrimaire(...
Ce que j'ai mis en rouge ne sert a rien puisque to DGV est lié !!
Tout ce que tu fais dans le DGV est automatiquement répercuté dans la DataTable de ton Dataset !!
Les modifications appliquées dans le Dataset se répercuteront dans le DGV puisqu'ils sont liés.
Ca je comprends pas nom plus puisque tu parle de valeurs que tu viens de prendre dans le DGV, non seulement elles sont repercutée mais elles y sont déja !!
Ou alors c'est moi qui comprends rien !
Utiliser alors la méthode Update pour mettre à jour la Bdd.
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 27 mars 2008 à 09:04
Salut !
+ Je travaille avec C# 2005 et FW 2.0.
+ Je ne connaissais pas la variable DataBoundItem. Effectivement c'est plus simple.
+ Je sais bien que vu que mon DGV est lié au dataset toute modif dans le DGV se répercute sur le dataset. Toutefois c'est de la théorie. Lorsque j'effectue plusieurs éditions dans le DGV, elles sont répercutées dans le dataSet mais n'apparaissent pas dans les changements à effectuer (getChanges) à chaque fois. Par conséquent lorsque j'effectue l'update certains champs ne sont pas modifiés dans la bdd.
Ma solution était donc d'effectuer l'édition dans le dataSet directement sur base de la valeur entrée dans le DGV et là il prend toutes les modifications en compte. Je récupere la valeur puis j'annule l'édition du DGV car comme il est lié au dataSet, parfois la valeur source et destination sont les mêmes et les changements ne sont pas pris en compte.
Evidemment si tu sais pourquoi l'édition dans mon DGV entraine une modification du dataset mais que les modifs à faire n'apparaissent pas dans getChanges() je suis tout ouïe !
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 27 mars 2008 à 19:32
Pourquoi? il existe beaucoup de solutions ?
J'ai utilisé deux manières.
1. Soit je crée une variable dataTable test = monDataSet.getChanges(); et je watch la variable
2. Soit j'ajoute un Watch sur monDataSet.getChanges() que je refreshe lors du debug au moment voulu et je visualise.
Ce sont les opérations d'édition de champs dans le DGV qui ne sont pas pris en compte à chaque fois.
@"#+++
brixi69
Messages postés44Date d'inscriptionmardi 13 juin 2006StatutMembreDernière intervention31 mars 2008 28 mars 2008 à 09:04
Oui je me doute bien que tu fais comme ca. Seulement moi les modifications n'apparaissent pas dans les operations à effectuer (getChanges) et par conséquent lors d'un update la bdd n'est pas mise à jour correctement.
" La question c'est pourquoi une édition dans mon DGV lié à mon dataSet se répercute sur le dataSet mais ne s'ajoute pas aux opérations à effectuer sur la bdd lors de l'update?".
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 28 mars 2008 à 09:09
As tu été verifié le RowState des lignes dans to datatable avant le getchange ?
As tu vérifié le count des elements données apres le getchange
Il y a aussi une différence entre ce que je fais et toi
c'est que moi je travaille par Tupe de modification