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

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

16 réponses

Répondre au sujet
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 avril 2017 à 17:30
0
Utile
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
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 19 avril 2017 à 18:53
0
Utile
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
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 19 avril 2017 à 19:04
0
Utile
2
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 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
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 avril 2017 à 21:01
Merci.
Commenter la réponse de Yorobahon
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 19 avril 2017 à 22:11
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 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.
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 20 avril 2017 à 23:37
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
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 02:55
0
Utile
2
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 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 21 avril 2017 à 08:30
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 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention > Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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?
Commenter la réponse de Yorobahon
sensa6on 131 Messages postés vendredi 19 octobre 2012Date d'inscription 21 avril 2017 Dernière intervention - 20 avril 2017 à 15:43
-1
Utile
4
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 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 20 avril 2017 à 16:37
C'est une pratique déconseillée, un exemple propriété est préférable à un champ public.
sensa6on 131 Messages postés vendredi 19 octobre 2012Date d'inscription 21 avril 2017 Dernière intervention > Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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.
Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 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
sensa6on 131 Messages postés vendredi 19 octobre 2012Date d'inscription 21 avril 2017 Dernière intervention > Yorobahon 8 Messages postés mercredi 19 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 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.
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.