Mise à jour Dataset depuis dataGridView + rowFilter

Signaler
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008
-
 Arthenius -
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

Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
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
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008

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"] = ...

@"#+++
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
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);
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

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
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
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;
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008

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 ?

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

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 ?

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

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.

@"#+++
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008

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à !
@"#+++
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
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.
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Encore une petite question :

Quelle version de Csharp utilise tu avec quel Framework ?
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
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
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008

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 !!!!

###

@"#+++
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Comment fais tu ton getChanges
Quelles modifications n'apparaissent pas ?
Messages postés
44
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
31 mars 2008

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

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?".

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