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

Windows Forms Discussion :

Modification de paramètre public de la fenêtre mère par la fenêtre fille


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut Modification de paramètre public de la fenêtre mère par la fenêtre fille
    Bonjour à tous !
    Je suis conscient que vous avez du voir passer pas mal de fois ce genre de sujet mais après de multiples recherches, non pas que je sache pas faire, mais je ne comprends pas pourquoi ça ne marche pas !
    Explications :
    - J'ai une fenêtre mère qui dispose d'une propriété public que j'appélerai rayon
    - Cette fenêtre mère ouvre une fenêtre fille au déclenchement d'un événement, jusque là c'est ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Int16 rayon = 0;
     
    private void BoutonOuvrir_Click(object sender, EventArgs e)
    {
           ClasseInterface monInterface = new ClasseInterface();
           monInterface.ShowDialog();
    }
    A la fermeture de la fenêtre fille, je souhaiterai modifier le rayon de la fenêtre mère (car la fenêtre fille permet d'éditer ce rayon...). La fille étant censé connaître sa mère, j'ai donc procéder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void BoutonOK_Click(object sender, EventArgs e)
    {
           this.ParentForm.rayon = maNumericBox.Value; //Ca ne fonctionne pas...
           this.Close();
           this.Dispose();
    }
    C'est cela qui ne fonctionne pas, la fille n'est pas en mesure de "retrouver sa mère", du moins son paramètre rayon alors que celui ci est public !
    Peut-être me suis-je gourrer sur la méthode mais je préfére que l'accés se fasse dans ce sens la (la fille modifie la mère) plutôt que la mère récupére le paramètre de la fille.
    Je vous remercie rien que si vous avez pris le temps de lire mon post et éventuellement d'y répondre si vous avez une piste.
    @+
    Antoine
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    C'est carrément mal de modifier un contrôle parent à partir d'un contrôle enfant.
    En l'occurence, tes Forms.

    La bonne solution :
    * si ta Form est modale, tu fais une propriété pour donner à la form mère sa nouvelle taille, et c'est la mère qui s'occupe de changer sa taille.

    * Si ta form n'est pas modale, il faut que ta fille déclenche un évènement (que tu auras créé dans la form fille), pour signifier à sa mère qu'il faut qu'elle change sa taille.

  3. #3
    Membre du Club Avatar de ferradji
    Inscrit en
    Septembre 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 121
    Points : 64
    Points
    64
    Par défaut
    si tu veux vraiment faire avec cette solution ! alors : dans ton événement déclancheur tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ClasseInterface monInterface = new ClasseInterface();
    monInterface.Owner=this;
     monInterface.ShowDialog();
    et dans ta form enfant tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void BoutonOK_Click(object sender, EventArgs e)
    {
     
       la_form_parent f1 = ( la_form_parent)this.Owner;
    f1.rayon = maNumericBox.Value; 
           this.Close();
           this.Dispose();
    }

  4. #4
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut
    Merci de vos réponse !!!
    Mose, je n'ai pas bien compris pourquoi il ne fallait pas opter pour cette solution et surtout je n'ai pas perçu une solution pour mon problème dans ta réponse...
    J'ai opter pour ton option ferradji mais cela ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void BoutonOK_Click(object sender, EventArgs e)
    {
     
           la_form_parent f1 = (la_form_parent) this.Owner;
           f1.rayon = maNumericBox.Value; //Cette ligne ne marche pas
           this.Close();
           this.Dispose();
    }
    Une exception NullReferenceException est levé à cette ligne... La référence d'objet n'est pas définie à une instance d'un objet.
    Je vous avoue que j'aimerai utiliser une meilleure solution si elle existe mais je ne connais pas encore trop les WinForms et je n'ai pas compris la solution que propose Mose !
    Merci encore et @+
    Antoine
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

  5. #5
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut
    D'après ce que j'ai compris (un peu...) il faudrait que je procède comme ceci :
    1. Créer la classe qui va hériter de EventArgs et qui va contenir les informations à envoyer (donc ma variable rayon)
    2. Créer un delegate qui va stocker une référence sur le gestionnaire d'évenéments ("Event Handler") c'est à dire la méthode qui va recevoir et traiter l' événement.
    3. Définir l'événement comme un objet de type delegate
    4. Définir une méthode qui va signaler aux objets enregistrés qu'un événement s'est produit.
    5. Appeler la méthode définie en 4 lorsque l'événement se produit.

    C'est ce qu'on apelle dans le jargon une solution "Usine à gaz"...
    "T'as pas k'qu'chose de plusss Béïsike la ? Plussss pratiquue hm ?" (Spéciale dédicace à ceux qui savent !)
    Merci @+
    Antoine
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

  6. #6
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Bah, sinon crée-toi un événement dans ta form fille, que ta form parent va capter

    edit: oh, je crois que c'est ce que tu venais d'expliquer dans le post au-dessus du mien
    .:: WOTC_MasterMind | Never Surrender | Warriors of The Cross ::.
    Il n'y a qu'une façon d'échouer, c'est d'abandonner avant d'avoir réussi.

  7. #7
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par NeraOne
    C'est ce qu'on apelle dans le jargon une solution "Usine à gaz"...
    Non, c'est pas une usine à gaz, c'est la seule façon correcte de procéder. Pas besoin de faire une classe spéciale alors que t'as juste besoin de passer un entier. Dériver de EventArgs c'est n'importe quoi, je connais personne qui oserai faire ça.
    Après tu peux faire du code qui marche mais qui sera tout pourri, c'est ton problème.

    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // tu déclares ton delegate
    public delegate void MonDelegate(int taille);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // dans ta classe fille
    public event MonDelegate ChangementDeTaille;
    // dans l'évènement de ta classe fille
    private void BoutonOK_Click(object sender, EventArgs e)
    {
      // si l'évènement a des abonnés
      if(this.ChangementDeTaille != null)
        // alors on le lance
        this.ChangementDeTaille(this.maNumericBox.Value);
    }
    Trop mortel l'usine à gaz...

  8. #8
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par Mose
    Dériver de EventArgs c'est n'importe quoi, je connais personne qui oserai faire ça.
    Pardon, mais moi je le fais Ça peut être pratique parfois, mais j'avoue qu'on peut procéder autrement.

    Citation Envoyé par http://msdn2.microsoft.com/fr-fr/library/system.eventhandler(VS.80).aspx
    La signature standard d'un délégué de gestionnaire d'événements définit une méthode qui ne retourne pas de valeur, dont le premier paramètre est du type Object et fait référence à l'instance qui déclenche l'événement, et dont le second paramètre est dérivé du type EventArgs et détient les données d'événement. Si l'événement ne génère pas de données d'événement, le second paramètre est simplement une instance de EventArgs. Sinon, le second paramètre est un type personnalisé dérivé de EventArgs et fournit tous les champs ou les propriétés nécessaires pour conserver les données d'événement.
    .:: WOTC_MasterMind | Never Surrender | Warriors of The Cross ::.
    Il n'y a qu'une façon d'échouer, c'est d'abandonner avant d'avoir réussi.

  9. #9
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut
    Désolé Mose, je n'ai pas ton excellence en développement C#. Pardon de faire des truc complétement incensé, tout pourri et dont personne dans l'univers entier n'a jamais osez faire !
    En atendant je test ta solution, merci bien
    @+
    Antoine

    humain.Organes.Remove("Cerveau");
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

  10. #10
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Mast3rMind
    Pardon, mais moi je le fais Ça peut être pratique parfois, mais j'avoue qu'on peut procéder autrement.
    Ca sert à quoi ?

    Le seul usage que je vois c'est éventuellement de passer par un EventHandler standard et d'y passer un argument perso... qu'il faudra recaster à la sortie.

    Entre ça et faire un delegate adapté, je préfère le delegate perso... mais y'a ptet des utilisations que j'ai pas vues...

  11. #11
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par NeraOne
    Désolé Mose, je n'ai pas ton excellence en développement C#. Pardon de faire des truc complétement incensé, tout pourri et dont personne dans l'univers entier n'a jamais osez faire !
    En attendant t'as au moins une aussi grande gueule que moi, alors que t'avais pas compris ce que je te proposais

    T'as encore du chemin à faire petit scarabée...

  12. #12
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut
    Je t'avoue que j'ai un peu lutter Mose mais j'ai enfin réussi avec ta solution, merci bien et @+
    Antoine

    humain.Organes.Add("Cerveau");
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation des varaibles de la JSP mère par une jsp fille
    Par didine501 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 25/05/2012, 12h08
  2. Réponses: 0
    Dernier message: 14/05/2012, 17h27
  3. Réponses: 1
    Dernier message: 02/08/2011, 12h48
  4. fermeture fenêtre mère à cause de la fille
    Par greg08 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/11/2008, 22h50
  5. Passage de paramètre fenêtre mère --> popup fill
    Par senacle dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/10/2005, 15h48

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