Manupulation entre deux form (form1 et form2)

Résolu
astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018 - 16 juil. 2018 à 14:49
astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018 - 2 août 2018 à 08:44
Bonjour,
J'ai une form1 qui contient un datagridview avec des informations qui viennent d'une base de données.
Dans cette datagridview il y a plusieurs lignes d'affichées suite à une recherche en fonction de certain critères de recherche.
Lorsque je fait un click sur une ligne pour la sélectionner, je vais rechercher des informations sur les données sélectionnées, dans la database. Ces nouvelles données sont affichées dans différentes zones de texte et liste de text dans ma seconde form Form2. Jusque la tout vas bien.
Maintenant sur ma form2 j'ai 4 boutons (1 bouton retour à la première ligne, 1 bouton reculer d'une ligne, 1 bouton avancer d'une ligne et 1 bouton aller à la dernière ligne.
Comment faire pour que chaque bouton agissent sur la sélection de ligne dans ma datagridview dans ma form1.
J'ai essayer d'utiliser un délégué mais je n'y arrive pas.
Pouvez vous m'aider sur mon problème? Merci d'avence pour votre aide.

--

27 réponses

astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018
31 juil. 2018 à 16:13
Bonjour. J'ai réussis à faire ce que je voulais.
Voici les modifications dans listearticle:
private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            //assagne la nouvelle valeur de ligne de sélection
            Dgv.Rows[nligne.Nligne].Selected = true;
            //rafraichie la fenêtre listearticle
            this.Refresh();

            counter = nligne.Nligne;
            //effectue un clic pour déclencher dgv_cellcontentclik
            Dgv_CellContentClick(sender, e);
        }


private void MettreAJour(int nligne, int nbart)
        {
            //envoie le numéro de ligne à la fenêtre article
            article.Nligne = nligne;
            //envoie le nombre de ligne à la fenêtre article
            article.Nbart = nbart;

        }

Dans la fonction Dgv_CellContentClick
//récupération du numéro d'article dans la ligne sélectionnée en colonne 6
            //e.RowIndex est mis à jour lorsque l'on clic sur une ligne pour la sélectionnée
            //si non e.RowIndex n'est pas mis à jour par le déplacement de la ligne de sélection
            //pour test
            if (truc == 0)
            {
                //récupération du numéro d'article dans la ligne sélectionnée en colonne 6
                Donnee = Dgv.Rows[e.RowIndex].Cells[5].Value.ToString();
            }
            else
            {
                //récupération du numéro d'article en fonction du compteur de ligne counter
                Donnee = Dgv.Rows[counter].Cells[5].Value.ToString();
            }
            //mise en forme de la donnée pour former la commande
            Donnee = String.Concat(S1, Donnee, S2);
            //récupération du nombre de lignes d'article affichés
            Nbart = dgv.Rows.Count;
            if (truc == 0)
            {
                //récupère le numéro de la ligne sélectionnée
                nligne = dgv.Rows[e.RowIndex].Index;
            }
            else
            {
                nligne = dgv.Rows[counter].Index;
            }
            ++truc;
            //envoie le nombre de ligne à la fenêtre article
            MettreAJour(nligne, nbart);
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 juil. 2018 à 19:17
C'est fou, j'ai l'impression que tu ne lis qu'une partie de mes réponses.... ceci
dgv.Rows[e.RowIndex].Index
est idiot, e.RowIndex c'est déjà le numéro de la ligne.


tester truc 2 fois de suite est non optimisé
            if (truc == 0)
            {
                //récupération du numéro d'article dans la ligne sélectionnée en colonne 6
                Donnee = Dgv.Rows[e.RowIndex].Cells[5].Value.ToString();
                 nligne = e.RowIndex;
            }
            else
            {
                //récupération du numéro d'article en fonction du compteur de ligne counter
                Donnee = Dgv.Rows[counter].Cells[5].Value.ToString();
                nligne = counter;
            }
            //mise en forme de la donnée pour former la commande
            Donnee = String.Concat(S1, Donnee, S2);
            //récupération du nombre de lignes d'article affichés
            Nbart = dgv.Rows.Count;
}

Fera la même chose, plus vite.

En plus, puisque tu n'appliques pas mon conseil de ne pas repasser par Dgv_CellContentClick(), MettreAjour() ne sert à rien, autant mettre son code à la suite dans Dgv_CellContentClick()
0
astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018
1 août 2018 à 10:34
Bonjour. Je vous assure que je lis vos conseils. J'ai rectifié truc comme vous le préconiser.
Je ne comprend pas votre proposition:
"En plus, puisque tu n'appliques pas mon conseil de ne pas repasser par Dgv_CellContentClick(), MettreAjour() ne sert à rien, autant mettre son code à la suite dans Dgv_CellContentClick()".
Pouvez-vous m'expliquer plus précisément ce que vous préconisez.
Pour moi, dans ce que j'ai fait, cela fonctionne. Peut-être mal mais cela fonctionne. C'est pour cela que je vous propose de vous envoyer mon projet.
Pour
Donnee = Dgv.Rows[e.RowIndex].Cells[5].Value.ToString();


--Ce bout de code me permet lorsque je clic pour la première fois sur une ligne:
1- de sélectionner la ligne et d’exécuter la fonction Dgv_CellContentClick qui remplit les champs de la form article en récupérant dans la 6ème cellules
un numéro unique et qui me permet d'extraire les informations de différentes tables de ma database.
2- de mettre à jour la position de la ligne sélectionnée dans la dgv.
Comme par la suite, j'utilise mes boutons de la form2 pour avancer, reculer, aller à la première ligne ou à la dernière ligne, e.RowIndex n'est pas mis à jour par le déplacement de la ligne de sélection. C'est pour cela que j'ai fais le petit bout de code "Truc".
Merci de votre réponse.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 août 2018 à 11:10
"En plus, puisque tu n'appliques pas mon conseil de ne pas repasser par Dgv_CellContentClick(), MettreAjour() ne sert à rien, autant mettre son code à la suite dans Dgv_CellContentClick()".
Pouvez-vous m'expliquer plus précisément ce que vous préconisez.


Dans ce message https://codes-sources.commentcamarche.net/forum/affich-10086905-manupulation-entre-deux-form-form1-et-form2#23 j'ai "créé" MiseAjour() pour que de Article_MoveLigne1() tu n'appelles pas Dgv_CellContentClick().
Or tu continue à le faire, puis tu passes dans MiseAjour().

C'est l'un ou l'autre, pas les 2.
Donc soit, tu ajoutes l'extraction de Donnee dans MiseAjour() et tu l'appelle directement depuis Article_MoveLigne1()
Soit tu supprimes MiseAjour() et tu remets le code à la fin de Dgv_CellContentClick().

Dans tous les cas, dès le début, je t'ai qu'avec le binding se serait plus simple.

As tu eu la politesse, de tester le code exemple que j'ai mis en ligne juste pour toi.
Il n'y a que 2 lignes de codes pour déplacer l'enregistrement....
0

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

Posez votre question
astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018
1 août 2018 à 16:15
bonjour.
J'ai fais ce qui suit dans listearticle et cela fonctionne.

/// <summary>
        /// fonction de déplacement de la ligne de sélection dans la datagrille
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="nligne"></param>
        private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            //assagne la nouvelle valeur de ligne de sélection
            Dgv.Rows[nligne.Nligne].Selected = true;
            //mise à jour du compteur deligne
            counter = nligne.Nligne;
            //effectue un clic pour déclencher dgv_cellcontentclik
            Dgv_CellContentClick(sender, e);
        }

        /// < summary>
        /// Fonction de mise à jour de la ligne sélectionnée dans la datagrille
        /// et envois les valeurs à la fenêtre article
        /// </summary>
        /*private void MettreAJour(int nligne, int nbart)
        {
            //envoie le numéro de ligne à la fenêtre article
            article.Nligne = nligne;
            //envoie le nombre de ligne à la fenêtre article
            article.Nbart = nbart;
        }*/

        /// <summary>
        /// bouton retour à la fenêtre principale
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click_1(object sender, EventArgs e)
        {
            //efface le contenue de la datagridview
            Dgv.Rows.Clear();
            //retour à la fenêtre principale du programme
            this.Visible = false;
        }

        /// <summary>
        /// affichage dans la fenêtre article le détaille de l'article
        /// après un clic sur la sélection d'une ligne dans la datagridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //définition du fournisseur d'acces à la datatbase
            DbProviderFactory dbpf = DbProviderFactories.GetFactory("System.Data.OleDb");
            //définition de l'objet de connexion à la database
            DbConnection oConn;
            //création de la connexion à la database
            oConn = dbpf.CreateConnection();
            //définition de la chaine de connexion à la database
            DbConnectionStringBuilder oCsb = new DbConnectionStringBuilder
                    {
                        { "Provider", "Microsoft.ACE.OLEDB.12.0" },
                        { "Data Source", "|DataDirectory|\\EITF.accdb" }
                    };
            oConn.ConnectionString = oCsb.ConnectionString;
            //ouvre la connexion
            oConn.Open();
            //définition de création de commande pour exécuter une commande pour acceder à la database
            DbCommand oCmd = oConn.CreateCommand();
            //commande de select count pour connaitre le nombre d'enregistrement
            oCmd.CommandText = "SELECT COUNT(*) FROM ELEKTOR";
            //récupération dans la variable totart le nombre d'enregistrement dans la table ELEKTOR
            Totart = (int)oCmd.ExecuteScalar();
            //ajoute =' avant la valeur entrée du numéro d'article. pour former la commande
            S1 = "='";
            //ajoute ' aprés la valeur entrée du numéro d'article. pour former la commande
            S2 = "'";
            //récupération du numéro d'article dans la ligne sélectionnée en colonne 6
            //e.RowIndex est mis à jour lorsque l'on clic sur une ligne pour la sélectionnée
            //si non e.RowIndex n'est pas mis à jour par le déplacement de la ligne de sélection
            //pour test
            if (truc == 0)
            {
                //récupération du numéro d'article dans la ligne sélectionnée en colonne 6
                Donnee = Dgv.Rows[e.RowIndex].Cells[5].Value.ToString();
                nligne = e.RowIndex;
            }
            else
            {
                //récupération du numéro d'article en fonction du compteur de ligne counter
                Donnee = Dgv.Rows[counter].Cells[5].Value.ToString();
                nligne = counter;
            }
            //mise en forme de la donnée pour former la commande
            Donnee = String.Concat(S1, Donnee, S2);
            //récupération du nombre de lignes d'article affichés
            Nbart = dgv.Rows.Count;
            //incrémentation de la variable truc
            ++truc;
            //envoie le nombre de ligne à la fenêtre article
            //MettreAJour(nligne, nbart);
            /****************************************************************************************/
            /* recherche dans la table elektor tous les enregistrments sélection sur numéro article. */
            /****************************************************************************************/
            //recherche ne nombre d'article. correspondant au numéro d'article.
            //définition de la commande select de lecture de la table elektor pour une recherche sur le numéro d'un article.
            oCmd.CommandText = "SELECT * FROM ELEKTOR WHERE ART_NR" + Donnee;
            // accès aux données de la table ELEKTOR
            DbDataReader oRdr;
            //exécition de la commande
            oRdr = oCmd.ExecuteReader();
            //vérification si fin de la table
            if (oRdr.HasRows)
            {
                //effectue une opération de lecture
                oRdr.Read();
                //récupération dans eps le champ eps depuis la table elektor
                bool eps = oRdr.GetBoolean(7);
                //récupération dans ess le champ ess depuis la table elektor
                bool ess = oRdr.GetBoolean(8);
                //récupération dans comp le champ compos depuis la table elektor
                bool comp = oRdr.GetBoolean(10);
                //remplissage du tittre de l'article.
                article.textBox1.Text = oRdr.GetString(5);
                //remplissage de l'anne, mois, page
                article.textBox2.Text = oRdr.GetString(3) + " / " + oRdr.GetString(2) + " / " + oRdr.GetString(4);
                //remplissage de la catégorie d'article.
                article.textBox3.Text = EITF2.Cate(oRdr.GetString(9));
                //remplissage du numéro d'article.
                article.textBox4.Text = oRdr.GetString(0);
                //remplissage du numéro de magazine
                article.textBox5.Text = oRdr.GetString(1);
                //remplissage de la zone circuit imprimé
                if (eps == true)
                {
                    //ferme la lecture de la table elektor
                    oRdr.Close();
                    //recherche dans la table pservice le numéro du circuit imprimé
                    oCmd.CommandText = "SELECT * FROM PSERVICE WHERE ART_NR" + Donnee;
                    //exécition de la commande
                    oRdr = oCmd.ExecuteReader();
                    //efface la listebox1 ci
                    article.listBox1.Items.Clear();
                    //clear la table dynamique
                    al.Clear();
                    //vérification si fin de la table
                    if (oRdr.HasRows)
                    {
                        //effectue une opération de lecture
                        while (oRdr.Read())
                        {
                            //remplissage des lignes de la table dynamique al avec les numéros de ci
                            al.Add(oRdr["SERVICE_NR"]);
                        }
                        //affichage de la recherche
                        for (I = 0; I < al.Count; I++)
                        {
                            //récupération du numéro du ci dans la table al
                            CIR = al[I].ToString();
                            //affichage de la recherche
                            article.listBox1.Items.Add(CIR);
                        }
                    }
                    //ferme de la commande de lecture
                    oRdr.Close();
                    //clear la table dynamique
                    al.Clear();
                }
                else
                {
                    //efface la listebox1 ci
                    article.listBox1.Items.Clear();
                    //affichage du message pas de ci
                    article.listBox1.Items.Add("Pas de Circuit Imprimé");
                    //clear la table dynamique
                    al.Clear();
                    //ferme de la commande de lecture
                    oRdr.Close();
                }
                //remplissage de la zone logiciel
                if (ess == true)
                {
                    //recherche dans le table sservice le numéro du circuit imprimé
                    oCmd.CommandText = "SELECT * FROM SSERVICE WHERE ART_NR" + Donnee;
                    //exécition de la commande
                    oRdr = oCmd.ExecuteReader();
                    //efface la listebox2 logiciel
                    article.listBox2.Items.Clear();
                    //clear la table dynamique
                    al.Clear();
                    //vérification si fin de la table
                    if (oRdr.HasRows)
                    {
                        //effectue une opération de lecture
                        while (oRdr.Read())
                        {
                            //remplissage des lignes de la table dynamique al avec les logiciels recherchés
                            al.Add(oRdr["SERVICE_NR"]);
                        }
                        //affichage de la recherche
                        for (I = 0; I < al.Count; I++)
                        {
                            //récupération du numéro du logiciel dans la table al
                            LOGI = al[I].ToString();
                            //affichage de la recherche du numéro de logiciel
                            article.listBox2.Items.Add(LOGI);
                        }
                    }
                    //ferme de la commande de lecture
                    oRdr.Close();
                    //clear la table dynamique
                    al.Clear();
                }
                else
                {
                    //efface la listebox2 logiciel
                    article.listBox2.Items.Clear();
                    //affichage du message pas logiciel
                    article.listBox2.Items.Add("Pas de logiciel");
                    //ferme de la commande de lecture
                    oRdr.Close();
                    //clear la table dynamique
                    al.Clear();
                }
                //remplissage de la zone composants spéciaux
                if (comp == true)
                {
                    //recherche dans le table komponen le numéro du circuit imprimé
                    oCmd.CommandText = "SELECT * FROM KOMPONEN WHERE ART_NR" + Donnee;
                    //exécition de la commande
                    oRdr = oCmd.ExecuteReader();
                    //efface la listebox3 composant
                    article.listBox3.Items.Clear();
                    //clear la table dynamique
                    al.Clear();
                    //vérification si fin de la table
                    if (oRdr.HasRows)
                    {
                        //lecture de la table
                        while (oRdr.Read())
                        {
                            //remplissage des lignes de la table dynamique al avec les composants recherché
                            s4 = oRdr["FABRICANT"]as string;
                            //vérifie si le champ fabricant est vide
                            if (s4 == null)
                            {
                                // supprime le champ fabricant
                                al.Add(oRdr.GetString(1));
                            }
                            else
                            {
                                //ajoute le champ fabricant
                                al.Add(oRdr.GetString(1) + "    " + oRdr.GetString(2));
                            }
                        }
                        //effectue une opération de lecture
                        for (I = 0; I < al.Count; I++)
                        {
                            //récupération du type de composant plus le fabricant
                            COMPOSANT = al[I].ToString();
                            //affichage de la recherche composant plus le fabricant
                            article.listBox3.Items.Add(COMPOSANT);
                        }
                    }
                    //ferme de la commande de lecture
                    oRdr.Close();
                    //clear la table dynamique
                    al.Clear();
                }
                else
                {
                    //efface la listbox1 des valeurs précédement entrées
                    article.listBox3.Items.Clear();
                    //affichage message pas de composant
                    article.listBox3.Items.Add("Pas de composants spéciaux");
                    //ferme de la commande de lecture
                    oRdr.Close();
                }
                //copie le message xxxx (variable nbart) article.s sélectés sur un total de YYYY (variable totart) fenêtre article.
                article.textBox9.Text = this.textBox1.Text;
                //message de test
                //MessageBox.Show("Numéro de la ligne sélectionnée dans la datagridview " + nligne,"N°de la ligne sélectionnée",MessageBoxButtons.OK, MessageBoxIcon.Information);
                //envoie le numéro de ligne à la fenêtre article
                article.Nligne = nligne;
                //envoie le nombre de ligne à la fenêtre article
                article.Nbart = nbart;
                //affiche la fenêtre article.
                article.Show();
                //cache la fenêtre listearticle
                //this.Visible = false;
                //ferme la lecture de la table elektor
                oRdr.Close();
            }
        }
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 août 2018 à 17:11
Et bien si ça fonctionne tout va bien.
Tu peux mettre le sujet résolu en cliquant sur la roue dentée tout en haut de la discussion.
0
astvt Messages postés 45 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 2 août 2018
2 août 2018 à 08:44
Bonjour.
Mon problème étant résolu, je ferme ce sujet.
Merci pour votre aide et vos conseilles.

--
0
Rejoignez-nous