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...
@"#+++
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"] = ...
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
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 ?
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 ?
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 ?
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
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.
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.
+ 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 !
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.
@"#+++
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?".
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