Mettre à jour une Form à la fermeture d'une autre Form

Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017 - 19 avril 2017 à 14:06
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017 - 21 avril 2017 à 15:09
Salut,

Je découvre le C# en développement en exemple une petite application de gestion des employés. Mais je bloque sur la communication entre 2 Form.
J'ai une Form Service qui me permet de gérer les services d'une société et une autre Form Direction qui permet de gérer les directions. En saisissant un service il peut arriver qu'on ait pas encore saisi sa direction, on ouvre donc Form Direction en modal au dessus de Form Service (par le biais du linkabel code direction).
Je voudrais qu'à la fermeture de Form Direction les modification soit apporté au Combo et Datagridview de la Form Service. Ci joint une image pour vous permettre d'avoir une meilleur idée. Merci.

6 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
19 avril 2017 à 17:30
Un exemple avec 2 Labels
1 dans FormService : LabelService
1 dans formDirection : LabelDirection

Dans l'évènement FormDirection_FormClosing tu mets
FormService.LabelService.text = LabelDirection.Text


il va de soi que la Form FormService doit être ouverte
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
19 avril 2017 à 18:53
merci pour ta reponse, vb95, mais cela ne fonctionne pas. En VB oui mais en C# non, et c'est la tout mon problème.
Quand je le fais on met comme erreur : "frmService.Control est inaccessible en raison de son niveau de protection." et quand je change sa propriété Modifiers à Public j'ai cette erreur : "Une référence d'objet est requise pour la propriété, la methode ou le champ non statique frmService.Control."
je galère.
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
19 avril 2017 à 19:04
Voici mon code pour remplir la combobox à l'ouverture de la form frmService.
SqlConnection MaConn = new SqlConnection() { ConnectionString = clsVariablesGlobales.Instance.Texte_Connexion };
            MaConn.Open();
            if (MaConn.State == ConnectionState.Open)
            {
                SqlDataAdapter adpter = new SqlDataAdapter("Select ServiceDesignation As Désignation,ServiceDescription as Description,DirectionDesignation as Direction From parametres_services Order By ServiceDesignation", MaConn);
                DataTable dt = new DataTable();
                adpter.Fill(dt);
                grdParametresService.DataSource = dt;
                MaConn.Close();
                grdParametresServiceView.BestFitColumns();
            }


et celui de la datagridview
DataTable dt1 = new DataTable();
            dt1.Columns.Add("Désignation");
            dt1.Columns.Add("Description");
            SqlConnection MaConn = new SqlConnection() { ConnectionString = clsVariablesGlobales.Instance.Texte_Connexion };
            MaConn.Open();
            SqlCommand MaCmd = new SqlCommand() { Connection = MaConn, CommandText = "Select * From parametres_directions Order By DirectionDesignation" };
            SqlDataReader MaDataRead = MaCmd.ExecuteReader();
            while (MaDataRead.Read())
            {
                dt1.Rows.Add(MaDataRead.GetString(0), MaDataRead.GetString(1));
            }
            MaDataRead.Close();
            MaConn.Close();
            cmbParametresServiceDirection.DataSource = dt1;
            cmbParametresServiceDirection.DisplayMember = "Désignation";
            cmbParametresServiceDirection.ValueMember = "Désignation";


Mon objectif est de reprendre ces mêmes codes pour mettre à jour la combobox et la datagridview à la fermeture de Form Direction, comme indiqué sur l'image.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
19 avril 2017 à 20:58
Désolé je pensais bien faire vu que C# et VB Net utilisent le même Framework ainsi que les mêmes objets
Mais C# est un peu un inconnu pour moi : je suis un ancien "Vb6iste" et je suis plus à l'aise en VB Net
Un "Cdièsiste" passera bien par là je pense pour te dépanner
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
19 avril 2017 à 21:01
Merci.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
19 avril 2017 à 22:11
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
20 avril 2017 à 23:06
Merci pour ta reponse.
La solution qui correspond le mieux à mon problème est : Passage de paramètres dans le constructeur du formulaire et génération d'évènements.
J'ai bidouillé un le code pour l'adapter à mon problème, et la j'arrive à mettre à jour les 2 controles combobox et datagridview mais ça m'affiche des erreurs juste après. Je refléchis encore si je trouve de solution je ferais un retour.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
Modifié le 21 avril 2017 à 00:03
Poste le code ou il y a l'erreur, on verra si on peut t'aider à la corriger.

Édit, vu que ton titre dit que la mise à jour doit se faire à la fermeture de l'autre formulaire, la méthode de l'inputBox me semble plus pertinente
0

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

Posez votre question
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
21 avril 2017 à 02:55
J'ai une solution à mon cas à partir de cette exemple (merci à Whismeril)
http://codes-sources.commentcamarche.net/source/26735-passage-de-parametres.
J'ai supprimer la classe Client je n'ai pas besoin parce je veux mettre à jour les controles (Combobox et datagridview) de la form Service à la fermeture de la form Direction.
Donc je déclare dans la classe frmdirection :
// Event utilisant le délégué pour spécifié qu'une modification a eue lieu.
		public event AddClientEventHandler Control_Update;
        // Délégué permettant de passage le Client d'une form à une autre.
        public delegate void AddClientEventHandler();


Ensuite à la fermeture de la form direction :
private void frmDirection_FormClosing(object sender, FormClosingEventArgs e)
        {
            bool FormOuvert = false;
            foreach (Form f in Application.OpenForms)
            {
                if (f.Name == "frmService")
                {
                    FormOuvert = true;
                }
            }
            if (FormOuvert == true)
            {
                Control_Update(); // On averti la class main qu'il ya modification
            }
        }


Dans la form Service je crée une methode pour l'application des mise à jour :
private void Modification_Controle()
        {
            ServiceRemplirCombo(); //Procédure pour ajouter des élements à la combobox
            ServiceRemplirGrille(); //Procédure pour remplir la datagridview
        }

Et enfin dans la methode qui affiche la formDirection
private void lblAfficherDirection_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frmDirection directionf = new frmDirection(); // On créer la nouvelle form
            directionf.Control_Update += new frmDirection.AddClientEventHandler(this.Modification_Controle); // Ici on s'abonne à l'event qui ne permettra de mettre à jour les controls
            directionf.ShowDialog(); // On l'affiche
        }


Bon voila je sais pas si je me suis fais comprendre, mais ça marche j'arrive à mettre à jour ma combobox et ma datagridview.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
Modifié le 21 avril 2017 à 08:37
Bonjour

Tu n'as pas mis le code de Control_UpDate()

Quelques axes d'amélioration
private void frmDirection_FormClosing(object sender, FormClosingEventArgs e)
        {
            bool FormOuvert = false;
            foreach (Form f in Application.OpenForms)
            {
                if (f.Name == "frmService")
                {
                    FormOuvert = true;
                    //pour gagner en temps d'exécution, tu peux arrêter le foreach dès que tu as trouvé. Ici ça ne va pas changer grand chose, mais le jour où tu auras une collection de plusieurs centaines de milliers d'item si.
                    break;
                }
            }
            if (FormOuvert == true)
            {
                Control_Update(); // On averti la class main qu'il ya modification
            }
        }


Encore un peu mieux
private void frmDirection_FormClosing(object sender, FormClosingEventArgs e)
        {
            bool FormOuvert = false;
            foreach (Form f in Application.OpenForms)
            {
                if (f.Name == "frmService")
                {
                    //tu peux éviter un If supplémentaire
                    Control_Update();
                    break;
                }
            }
        }


Encore un peu mieux, tu peux t'éviter la recherche si tu as passé frmService en paramètre, on va dire que la variable est service
private void frmDirection_FormClosing(object sender, FormClosingEventArgs e)
        {
            
            if (service != null )//on vérifie que service n'a pas été fermée 
            {
                Control_Update(); // On averti la class main qu'il ya modification
            }
        }


Et selon le code de Control_Update(), on peut peut être encore optimiser
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017 > Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024
21 avril 2017 à 15:09
Oui je me suis trompé de code. Voici le code de Control_Update :
 private void Control_Update()
        {
            ServiceRemplirCombo(); //Procédure pour ajouter des élements à la combobox
            ServiceRemplirGrille(); //Procédure pour remplir la datagridview
        }


Code de ServiceRemplirCombo() :
private void ServiceRemplirCombo()
        {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("Désignation");
            SqlConnection MaConn = new SqlConnection() { ConnectionString = clsVariablesGlobales.Instance.Texte_Connexion };
            MaConn.Open();
            SqlCommand MaCmd = new SqlCommand() { Connection = MaConn, CommandText = "Select * From parametres_directions Order By DirectionDesignation" };
            SqlDataReader MaDataRead = MaCmd.ExecuteReader();
            while (MaDataRead.Read())
            {
                dt1.Rows.Add(MaDataRead.GetString(0));
            }
            MaDataRead.Close();
            MaConn.Close();
            cmbCodeDirection.DataSource = dt1;
            cmbCodeDirection.DisplayMember = "Désignation";
            cmbCodeDirection.ValueMember = "Désignation";
            cmbCodeDirection.SelectedIndex = -1;
        }


Vode de ServiceRemplirGrille() :
private void ServiceRemplirGrille()
        {
            dgvServiceView.Rows.Clear();
            SqlConnection MaConn = new SqlConnection() { ConnectionString = clsVariablesGlobales.Instance.Texte_Connexion };
            MaConn.Open();
            SqlCommand MaCmd = new SqlCommand() { Connection = MaConn, CommandText = "Select * From parametres_services Order By ServiceDesignation" };
            SqlDataReader MaDataRead = MaCmd.ExecuteReader();
            while (MaDataRead.Read())
            {
                dgvServiceView.Rows.Add(MaDataRead.GetString(0), MaDataRead.GetString(1), MaDataRead.GetString(2));
            }
        }


Merci pour l'amélioration du code. Ou dois je passer frmService en paramètre?
0
sensa6on Messages postés 130 Date d'inscription vendredi 19 octobre 2012 Statut Membre Dernière intervention 26 octobre 2018
20 avril 2017 à 15:43
Bonjour,

Dans FormDirection.cs tu déclares une variable :
public string codeDirection = "";


Puis dans FormService.cs, à l'appui sur le LinkLabel Code direction :
private void linkLabel_CodeDirection_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
using (var form = new frmDirection())
{
form.ShowDialog();

//Ici tu peux utiliser directement ta variable "codeDirection" de "FormDirection.cs"
//Pour y accéder il suffit de taper "form.codeDirection", exemple avec ta comboBox :
comboBox_Code_Direction.Text = form.codeDirection;
}
}
-1
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
20 avril 2017 à 16:37
C'est une pratique déconseillée, un exemple propriété est préférable à un champ public.
0
sensa6on Messages postés 130 Date d'inscription vendredi 19 octobre 2012 Statut Membre Dernière intervention 26 octobre 2018 > Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024
21 avril 2017 à 09:06
Pas d'inquiétude, j'utilise moi-même des propriétés et pas des champs publics, juste que je ne voulais pas compliquer mon exemple en mettant de getter/setter. L'essentiel est que ça marche.

De plus je précise qu'avec cette technique codeDirection n'est accessible seulement depuis l'instance ouverte grace au using.
0
Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
20 avril 2017 à 23:14
Merci sensa6on pour ton aide,

En plus je crois que ton idée me permettra juste d'afficher la valeur afficher du combobox (form service) dans un textebox de la form direction.
Mon soucis est d'appliquer les mise à jour effectuées que quand je ferme form direction aux 2 controles(combobox et datagridview)
une solution est proposé ici
http://codes-sources.commentcamarche.net/source/26735-passage-de-parametres
J'arrive à l'adapter à mon cas pour le moment
0
sensa6on Messages postés 130 Date d'inscription vendredi 19 octobre 2012 Statut Membre Dernière intervention 26 octobre 2018 > Yorobahon Messages postés 8 Date d'inscription mercredi 19 avril 2017 Statut Membre Dernière intervention 21 avril 2017
21 avril 2017 à 09:12
Dans mon exemple tu peux imaginer que le thread dédié à la formService est bloqué (ligne 5) et attend la fermeture du formDirection avant d'exécuter la suite du code.
0
Rejoignez-nous