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

Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
- - Dernière réponse : Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
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.
Afficher la suite 

Votre réponse

6 réponses

Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
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
Commenter la réponse de vb95
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
0
Merci
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.
Commenter la réponse de Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
0
Merci
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.
vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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
Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
> vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
Merci.
Commenter la réponse de Yorobahon
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
-
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.
Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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
Commenter la réponse de Whismeril
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
0
Merci
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.
Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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
Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
> Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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?
Commenter la réponse de Yorobahon
Messages postés
135
Date d'inscription
vendredi 19 octobre 2012
Dernière intervention
26 octobre 2018
-1
Merci
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;
}
}
Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
C'est une pratique déconseillée, un exemple propriété est préférable à un champ public.
sensa6on
Messages postés
135
Date d'inscription
vendredi 19 octobre 2012
Dernière intervention
26 octobre 2018
> Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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.
Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
-
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
sensa6on
Messages postés
135
Date d'inscription
vendredi 19 octobre 2012
Dernière intervention
26 octobre 2018
> Yorobahon
Messages postés
8
Date d'inscription
mercredi 19 avril 2017
Dernière intervention
21 avril 2017
-
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.
Commenter la réponse de sensa6on

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.