Mise à jour Dataset depuis dataGridView + rowFilter

brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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...
@"#+++

40 réponses

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
24 févr. 2008 à 21:12
Salut

J'ai aussi ramé dans ces trucs la
Tu a essayé la methode Getchanges ?

http://www.csharpfr.com/infomsg_GETCHANGES-DELETED-ROWS_1078601.aspx#2
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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"] = ...

@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
25 févr. 2008 à 10:10
Bonjour

Oui si tu veux faire des modifs programaticaly dans to datagridview bindé sur un dataset tu DOIS faire les modif dans le DATASET

Ma methode c'est pour appliquer les modifs danss la DB en SQL
Ce sujet ne semble pas tres connu ou suporté dans beaucoup de forum.

Pas a pas
      MySqlCommandBuilder cb = new MySqlCommandBuilder(adaAddr);
(ca c'est une commande magique !!)


      DataSet ch = new DataSet();
      ch = dsAddr.GetChanges(DataRowState.Deleted);
      adaAddr.Update(ch);


      ch = dsAddr.GetChanges(DataRowState.Modified);
      adaAddr.Update(ch);


      ch = dsAddr.GetChanges(DataRowState.Added);
      adaAddr.Update(ch);
0
ecosmose Messages postés 46 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 30 septembre 2010
17 mars 2008 à 01:24
Idem possible réponse donnée sur le lien de Olibara..peut que ta lanterne sera illuminée..

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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

          DataRowView drv = (DataRowView)dgv_ContUpd.Rows[i].DataBoundItem;
          DataRow dr = drv.Row;
          dr["addrID"] = -1;
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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 ?

@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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 ?
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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 ?

@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008
22 mars 2008 à 15:59
Je n'ai jamais utilisé cette méthode je vais y jeter un oeil quand j'aurai le temps. Je laisserai un feedback prochainement.
Merci pour ton aide.

@"#+++
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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.

J'espere avoir été clair. Voilà !
@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
26 mars 2008 à 17:21
Encore une petite question :

Quelle version de Csharp utilise tu avec quel Framework ?
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
26 mars 2008 à 19:10
Encore une remarque :


   +Récupération de la clé unique pour le reperage dans le dataset



La maniere la plus directe et fiable d'atteindre le Row DataTable lié a ton DataGridViewRow est : DataBoundItem

          DataRowView drv = (DataRowView)dgv.Rows[i].DataBoundItem;
          DataRow dr = drv.Row;

MAIS j'insiste pour dire que ce n'est pas du tout nécessaire dans ton cas
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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 !

Encore merci beaucoup pour ton aide !!!!

###

@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
27 mars 2008 à 11:47
Comment fais tu ton getChanges
Quelles modifications n'apparaissent pas ?
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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.
@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
27 mars 2008 à 21:15
Voici un exemple de GetChange comme j'ai l'habitude de faire 
jamais de problème

    private void do_UpdChauf()
    {


      MySqlCommandBuilder cb = new MySqlCommandBuilder(adaChauffUpd);
      DataSet ch = new DataSet();

      ch = dsChauffUpd.GetChanges(DataRowState.Deleted);


      if (null != ch)
      {
        int del = adaChauffUpd.Update(ch);
      }


      ch = dsChauffUpd.GetChanges(DataRowState.Modified);
      if (ch != null)
      {
        int upd = adaChauffUpd.Update(ch);
      }
etc...
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 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?".

@"#+++
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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

DataRowState.Modified, etc..
0
Rejoignez-nous