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

C# Discussion :

Appeler une méthode parent depuis une dll usercontrol


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut Appeler une méthode parent depuis une dll usercontrol
    Bonjour,
    J'ai créé une classe Form1 dans un fichier "Form1.cs" qui hérite de la classe Form avec une méthode MethodeA().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    using B
    namespace A
    {
       public partial class Form1 : Form
       {
           public Form1()
           {
              InitializeComponent();
            }
            public void MethodeA()
            {
            }
       }
    }
    Dans le concepteur graphique de Form1, j'ai placer la classe controlPerso suivante, qui a été créé dans un fichier "ControlPerso.dll" et qui hérite de la classe UserControl.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    using A;
    namespace B
    {
       public partial class ControlPerso: UserControl
       {
           public ControlPerso() // Ligne 1
           {
              InitializeComponent();
           }
           public void MethodeB()
           {		    
              // Je veux appeler la methodeA() mais je n'y arrive pas // Ligne 2
           }
        }
    }
    Le constructeur de ControlPerso est donc automatiquement placer dans un fichier "Form1.Designer.cs" dont voici une partie du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace A
    {
       partial class Form1
       {
           private void InitializeComponent()
           {
              this.controle = new B.ControlPerso(); // ligne 3
              ...
            }
            ...
            private B.ControlPerso controle;
        }
    }
    Mon problème est le suivant: à partir de la methodeB(), je dois utiliser la methodeA(), comment faire ? (J'ai bien pensé à remplacer la ligne 3 et la ligne 1 par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ligne 3 <- this.controle=new B.ControlPerso(this)
    Ligne 1 <- Public ControlPerso(Form1 _Parent)
    en créant une instance Parent pointant sur _Parent, mais cela ne marche pas: le fichier "Form1.Designer.cs" refuse de s'afficher correctement.
    Y-a-t-il une solution pour référencer Form1 dans la dll?
    Merci pour vos réponses.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu ne peux pas modifier le code du fichier .designer.cs (enfin tu peux, mais si tu le fais tes modifs seront écrasées à chaque fois par le designer)

    Tu peux récupérer la fenêtre comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void MethodeB()
    {
        Form1 form = this.FindForm() as Form1;
        if (form1 != null)
            form1.MethodeA();
    }
    Cela dit, c'est assez crade comme façon de faire... un UserControl ne devrait pas avoir de dépendance sur la fenêtre qui le contient, sinon il n'est plus réutilisable ailleurs que dans cette fenêtre

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Dans le meme genre, sans que le controle dépende de sa form, tu peux faire de l'inversion de dépendance grace à une interface :

    dans une Dll MesInterfaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface ILaForme
    {
       voidMethodA();
    }
    dans ton exe ou Dll MesForms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {
    public class Form1 : ILaForme
    {
       public void MethodA()
       {
         // Du code
       }
    }
    }
    Dans "ControlPerso.dll"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public partial class ControlPerso: UserControl
       {
          ILaForm _form = null;
     
           public ControlPerso() // Ligne 1
           {
              InitializeComponent();
              object obj = this.FindForm();
              if(!obj is ILaForm)
                 throw new Application Exception("Ce controle ne peut etre utilisé que dans une form implémentant ILaForm");
              _form = obj as ILaForm;
     
           }
           public void MethodeB()
           {		    
                 if (_form != null)
                    _form .MethodeA();
           }
    Ainsi, ton exe dépend de MesInterfaces.dll et de ControlPerso.dll
    ContolPerso.dll dépend aussi de MesInterfaces.dll
    Mais tu pourra utiliser ton controle avec n'importe quel form sans toucher à son code

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos réponses.
    J'ai utilisé la 2ème méthode.
    J'ai créer une dll de mon interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ClassInterface
    {
        public interface IForm1
        {
            void MethodeA();
        }
    }
     
    puis, un user control perso:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using ClassInterface;
     
    namespace UserControlLibrary1
    {
        public partial class ControlPerso : UserControl
        {
            IForm1 form1 = null; // permet de bloquer le drag/drop dans un concepteur si la form ne possède pas d'interface pour MethodeA()
     
            public ControlPerso()
            {
                InitializeComponent();
             }
     
            private void button1_Click(object sender, EventArgs e)
            {
                form1 = this.FindForm() as IForm1; // Ligne 1
                form1.MethodeA();
            }		
         }
    }
    enfin ma form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using ClassInterface;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form,IForm1
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            public void MethodeA()
            {
                label1.Text = "MethodeA() executée.";
            }
        }
    }
    Ca marche bien. Mais toutefois, je ne suis pas satifait du placement de la ligne 1 car la fonction FindForm() ne nécessiterait qu'1 seul appel pour définir l'instance form1, hors ici c'est répétitif à chaque clic. J'ai donc replacer cette ligne dans le contructeur ControlPerso() ou dans une méthode Load() du control, mais rien à faire, je récupère un object null pour l'instance form1.
    Ma question est la suivante: où placer cette ligne pour définir une 1 fois form1 dans le control?

    Merci pour votre aide.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Ca y est, j'ai trouvé où placer cette ligne 1, il suffit de la placer dans l'évènement ParentChanged(object sender, EventArgs e) du controlPerso pour être appeler 1 seule fois et définir l'instance form1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void ControlPerso_ParentChanged(object sender, EventArgs e)
            {
                form1 = this.FindForm() as IForm1;
            }
    Maintenant la question est bien résolue. Merci encore.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Par contre, tu ferais mieux de renommer ton interface... une interface décrit un contrat implémenté par une classe, il faut que ça ait un nom significatif. "IForm1", ça ne donne absolument aucune indication sur le rôle de cette interface

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

Discussions similaires

  1. Exécuter une méthode parent depuis un enfant
    Par BAUDRY39 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/05/2014, 10h47
  2. Réponses: 2
    Dernier message: 18/09/2012, 14h58
  3. Réponses: 8
    Dernier message: 07/11/2011, 23h38
  4. Comment appeler une méthode public depuis une autre class
    Par Gregi dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 01/03/2010, 10h08
  5. Ouvrir une requête QBE depuis une méthode pushbutton
    Par Astéroïde dans le forum Paradox
    Réponses: 2
    Dernier message: 23/07/2007, 16h22

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