IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rafraichir contenu d'un form via la fermeture d'un autre form


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut Rafraichir contenu d'un form via la fermeture d'un autre form
    Bonjour à tous,

    Je rencontre un problème et je n'ai pas réussi a trouver la réponse par moi même.

    Mon problème est le suivant :

    J'ai un DataGridView datasourcé a une table, sur le form1.
    Un bouton me permet d'ouvrir un form 2 afin d'ajouter des infos à ma table.

    J'aimerais pouvoir rafraichir le contenue du DataGridView lors de la fermeture du form 2.

    J'ai pensé a l'event de fermeture du form2 mais cela ma mené nul part.

    J'espère que j'ai pu être assez clair, et que l'on pourra trouver une solution à mon problème.

    Je vous remercie d'avance.

    Cordialement,
    Hiken.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Si la table est partagée par les deux Forms, les modifications vont automatiquement, via le databinding, ce voir dans les 2 Forms.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Bonjour bacelar,

    Merci pour ta réponse.

    Dans mon Form1 je charge la table dans un DGV via DataTable (requete SELECT * FROM table1). Puis via le dgv.DataSource = DataTable;

    Ensuite dans mon Form2 j'ai quelques champs de saisie (textbox, combobox, ...).
    Une fois ma saisie effectué, j'exécute ma requête INSERT avec la valeur des champs récupérés.

    Je vois pas trop comment faire un databinding pour mon cas ?

    J'aimerais simplement pouvoir, lors de la fermeture du form2, voir ma table ou DGV se rafraichir avec les nouvelles modifications apportées à la table.

    Hiken.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    L'objectif d'une DataTable est de servir de source de donner.
    Il ne faut pas faire d'insert à la main dans les tables de la base de données.
    Il faut ajouter des lignes dans la DataTable et l'utiliser comme paramètre d'entré d'un DataAdapter qui fera la mise à jour bi directionnelle entre la DataTable et la base de données.
    En modifiant la DataTable via des insertions, Form1 sera automatiquement à jour.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Ok donc si j'ai bien compris ce que tu m'explique, j'ai essayé çà :

    • Un DataTable commun a toutes mes requêtes.
    • Form 1 contient.
      • DataApadter1 (Requête SELECT).
      • DataAdapter1.fill(DataTable);
      • DGV.Datasource = DataTable
    • Form 2 contient.
      • DataApter2 (Requête INSERT).
      • DataAdapter2.fill(DataTable);


    Donc effectivement le fait d'avoir un seul DataTable marche aussi, les deux requêtes s'exécute bien.
    Mais lors de la fermeture du form2, le DGV ne se rafraichi toujours pas.

    J'ai surement manquer quelque chose

    Hiken.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Si vous êtes plus dans une approche Clickodrome que Document/Vue, je serais plus sur :
    • Form 1 contient.
      • DataApadter1 (Requêtes SELECT ET INSERT).
      • DataAdapter1.fill(DataTable);
      • DGV.Datasource = DataTable
    • Form 2 contient un champ référençant une DataTable .


    Lors de la construction de Form2, vous fournissez une référence vers la DataTable dans les paramètres du constructeur de Form2 ; ou en initialisant le champ avant l'affichage de la Form2 avec la DataTable de Form1.

    Dans le code de Form2, vous insérer vos données dans la DataTable dont la référence est dans le champ qui va bien.

    Si vous voulez mettre à jour la base immédiatement après la fin de la Form2, vous utiliser la méthode DataAdpater1.Update(DataTable) dans Form1. Mais vous n'êtes pas obligé de la faire tout de suite si vous voulez pouvoir annuler les modifications plus tard.

    Comme vous insérez directement dans DataTable, DGV est à même de récupérer automatiquement les nouveaux éléments.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    J'ai bien réfléchi à ce que vous m'avez expliqué.
    Franchement je comprend pas tout.

    Mon problème a l'air assez simple et j'ai l'impression d'avoir manquer quelque chose.

    Admettons que j'ai un form1 contenant seulement un DGV datasourcé a un Datatable ( requête select * from table), et un bouton ouvrant form2.

    form2 lui contiens seulement un bouton, qui, lors du clic déclenche l'ajout d'un élément dans la table (ex Id=5, INSERT INTO TABLE (ID) VALUES (5).

    J'aimerais simplement lors du clic sur ce bouton et de la fermeture du form2, donc retour sur le form1 voir ma DGV actualisée avec la nouvelle ligne contenant id=5.

    Je comprend pas comment réaliser ca.
    J'ai pourtant bien essayer votre explication mais en vain.

    Je vous remercie de votre aide.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Par défaut
    form2 lui contiens seulement un bouton, qui, lors du clic déclenche l'ajout d'un élément dans la table (ex Id=5, INSERT INTO TABLE (ID) VALUES (5)
    Vu ce que tu fais ici, tu ajoutes une ligne à la table de la base de données et non du DataTable. Tu devrais appeler normalement la méthode NewRow de ta DataTable, puis initialiser les champs et ensuite ajouter la ligne à la collection Rows de ton DataTable.A ce moment là, tu auras modifié ton DataTable(mais pas ta base de données). Alors que si tu ajoutes ta ligne à ta base de données, les changements ne sont pas appliqués à ta DataTable.Il faut travailler sur la DataTable et non sur la base. A la fin, lorsque tu veux updater ta base, il y a une méthode de ton DataSet, Save je crois.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Merci Miko95, pour ta réponse :

    J'ai bien ajouté ma ligne comme tu l'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                DataRow row;
                row = Form1.myDataTable.NewRow();
                row["ID"] = 5;
                Form1.myDataTable.Rows.Add(row);
    Donc ce code marche très bien est effectivement mon DGV s'actualise, mais je n'est pas trouver la commande pour appliquer mes changements à ma BDD.
    J'ai trouvé AcceptChanges mais ça ne marche pas.

    Deuxième question :

    Cela marche apparemment bien pour l'Insert, mais quand est-il de l'Update, comment faire pour mettre a jour mon dataTable ? Idem pour le Delete ?
    Et pour toutes les requêtes qui demanderons des clauses particulières (Where, And ...)

    Hiken.

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Par défaut
    La méthode AcceptChanges permet d'accepter les changements que tu as fais sur ton DataTable(add,delete,update). Quand j'avais utilisé un DataSet, je me souviens ne pas avoir utilisé cette méthode AcceptChanges.
    Pour que les changements que tu as fais sur ta DataTable soient répércutés dans la table correspondante de la base, tu dois utiliser la méthode Update du DataAdapter correspondant à cette meme DataTable.

    Si tu as une DataTable Patients et que tu as créé un DataAdapter daPatients pour cette meme table. Alors, pour sauvegarder les changements dans la base, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    daPatients.Update(Patients);
    Il faut passer en argument à Update, la DataTable correspondante.

    Mais pour que l'update fonctionne, il faut au préalable définir les requetes(insert,update,delete).Pour ca, tu peux soit les faire toi meme ou sinon utiliser un SqlCommandBuilder pour chaque DataAdapter.
    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SqlCeCommandBuilder cmdBldrPatients = new SqlCeCommandBuilder(daPatients);
     
    daPatients.DeleteCommand = cmdBldrPatients.GetDeleteCommand();
    daPatients.InsertCommand = cmdBldrPatients.GetInsertCommand();
    daPatients.UpdateCommand =cmdBldrPatients.GetUpdateCommand();
     
    daPatients.Update(ds.Tables["Patients"]);

  11. #11
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Par défaut
    Pour ce qui est du Delete dans la DataTable, tu peux appeler la méthode Delete du DataRow que tu veux supprimer.
    Pour l'update, bah tu modifie les éléments de DataRow.

    Dans ce cas, tu te retrouves avec une DataTable modifié mais ta base ne l'est pas encore et pour cela, utilises la méthode que j'ai décris dans le post précédent.

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Salut,

    Donc j'ai essayé plusieurs choses, mais franchement je n'y arrive pas.
    J'arrive bien à ajouter ma ligne à mon datatable, mais aprés je suis perdu

    Je peux même pas te mettre le code que j'ai testé car c'est trop confus.

    As tu un exemple simple ou tu affiche le contenu d'une table dans un DGV et tu met a jour ce DGV en passant par ton DataTable ?

    Hiken.

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Par défaut
    Je ne vois pas sur quoi tu bloque. Pour supprimer une ligne il suffit d'appeler la méthode Delete sur la ligne que tu veux supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligneASupprimer.Delete();
    Pour modifier une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligneAModifier["nomDeLaColonneAModifier"] = nouvelleValeur ;
    Pour appliquer les changements dans la base, j'ai posté le code déjà.
    Je ne vois pas ou est le problème dans ton DGV?

    Puisque la source de donnée de ton DGV est le DataTable, toute modification faite sur la DataTable devrait etre appliqué au DGV.

  14. #14
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Tiens je te donne ce que j'ai essayé de faire mais ça ne marche pas l :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Connexion();
     
    string requete= "SELECT * FROM Table1";
     
    OdbcCommand myCommand = new OdbcCommand(requete, connexion);
    OdbcDataAdapter myDataAdapter = new OdbcDataAdapter(myCommand);
     
    DataSet ds = new DataSet();
    myDataAdapter.Fill(ds, "Table1");
     
    DataTable dt = ds.Tables["Table1"];
    OdbcCommandBuilder cmdbuild = new OdbcCommandBuilder(myDataAdapter);
     
    DataRow newrow;
    newrow = dt.NewRow();
    newrow["ID"] = 5;
    dt.Rows.Add(newrow);
     
    myDataAdapter.InsertCommand = cmdbuild.GetInsertCommand();
    ds.AcceptChanges();
    myDataAdapter.Update(ds.Tables["Table1"]);
    myDataAdapter.Fill(ds, "Table1");
    dataGridView1.DataSource = ds;
    Je pense mettre mélangé les pinceaux.
    J'ai compris le principe mais je n'arrive pas à le mettre en pratique.

Discussions similaires

  1. [Lazarus] Afficher une form dans le panel d'une autre form
    Par jojo86 dans le forum Lazarus
    Réponses: 2
    Dernier message: 22/05/2012, 00h02
  2. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59
  3. ouvrir un form à partir de données d'un autre form
    Par fanico11 dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/04/2008, 12h11
  4. Copie d'un champ de form lie dans champ d'un autre form
    Par nb_pc dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/01/2008, 12h55
  5. Réponses: 2
    Dernier message: 09/01/2007, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo