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 :

Accéder à une méthode depuis un form


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut Accéder à une méthode depuis un form
    Bonjour,

    J'ai défini une méthode publique dans un form (Form1).
    J'ouvre une popup (Form2) depuis ce form.

    Lorsque je clique sur un bouton de Form2, je souhaite invoquer la méthode publique définie dans Form1.

    private void button1_Click(object sender, EventArgs e)
    {
    Form1.xxxxx ???
    this.Close();
    }

    La complession ne me permet pas d'accéder à cette méthode. Je ne sais pas comment faire...

    Merci

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ta méthode dans Form1 doit être marquée comme étant static

  3. #3
    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
    Niveau architectural, c'est très très mal ce que tu veux faire.

    Ensuite :
    * Si tu veux appeler une méthode d'instance, il faut faire l'appel depuis une instance, pas depuis la classe.
    * Si tu veux appeler une méthode de classe (comme tu 'las fait), il faut déclarer ta méthode comme une méthode de classe (voir la réponse de Thomas)

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 27
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Je débute en C#,

    Mose, suite à ta réponse, je me pose la question suivante :

    tu indiques de passer par une instance de la classe, cela veut t'il dire que dans form2, tu ajoutes le code suivant :

    private void BtnRetourForm1_Click(object sender, System.EventArgs e)
    {
    Form1 maForm = new Form1();
    this.Hide();
    maForm.Owner = this;
    maForm.ShowDialog();
    }


    Mais alors, à chaque fois que l'on va switcher entre la form1 et la Form2,
    il faut recréer une nouvelle instance de la class Form1 ?

    Est ce vraiment "clean" de procéder de cette manière ? (n'y a t'il pas de saturation mémoire au bout de n switch ? )

    Est ce que Le garbage Collector gère en auto la destruction de l'instance à chaque switch ?


    caviar

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Il y a un autre moyen de faire :
    1 - Ajouter un constructeur dans la Form2 avec un paramètre de type Form
    2 - Ajouter dans la Classe Form2 une donnée membre de Type Form qui sera initialisée par le constructeur créer précedement.
    3 - Dans la création de la Form2 qui est faite dans la Form1 il faut utiliser le constructeur créer précedement en passant en argument This.

    Exemple de code :
    //-----------------------
    //Dans la Classe Form2
    //-----------------------

    // Constructeur
    public Form2(Form formAppelante)
    {
    InitializeComponent();
    referenceFormAppelante = formAppelante;
    }

    // Donnée membre
    private Form referenceFormAppelante = null;

    // Méthode liée au Click
    private void button1_Click(object sender, EventArgs e)
    {
    referenceFormAppelante.MethodeTruc();
    this.Close();
    }

    //-----------------------
    //Dans la Classe Form1
    //-----------------------

    public void Methode1()
    {
    Form2 f = new Form2(this);
    f.ShowDialog();
    }

    De cette façon tu garde une référence sur la Form appelante et donc tu peux faire appel à des méthodes d'instances.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Par rapport à la réponse de Mose, qu'est ce qui n'est pas bien ?

    J'ai fais passer l'instance de mon Form dans le constructeur. Et cela fonctionne.

    Pour le reste il me semblait propre de faire effectuer un traitement par le composant concerné (mettre à jour des champs) lui-même.

    Merci à tous

  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 caviar
    [B]Mais alors, à chaque fois que l'on va switcher entre la form1 et la Form2, il faut recréer une nouvelle instance de la class Form1 ?
    Ah non, je t'ai jamais dit d'instancier une nouvelle form.
    En revanche, tu peux passer la référence de ta Form1 à ta Form2.

    Bon, ceci dit c'est pas très très bien non plus.
    Normallement, il faut voir une appli comme une hiérarchie : la Form de base peut connaître tous ses sous-contrôles, et les sous-Form et les sous-contrôles doivent revenir vers elle via des évènements.
    Ca te permet de conserver une certaines indépendance entre tes contrôles et d'éviter de faire du code "spaghetti".


    Citation Envoyé par caviar
    Par rapport à la réponse de Mose, qu'est ce qui n'est pas bien ?
    Pour le reste il me semblait propre de faire effectuer un traitement par le composant concerné (mettre à jour des champs) lui-même.
    Que le composant agisse sur les données, OUI.
    Qu'il agisse directement sur le contrôle qui le contient, NON.
    Exemple :
    * Form1 a un label "Nom"
    * Pour modifier le nom, tu fais apparaitre une boite de dialogue Form2 "saisissez le nom".
    * Deux choix :
    1 - (mal) : Form2 modifie le label contenant le nom dans Form1
    2 - (bien) :
    * Dans Form2 tu créé une propriété Nom qui retourne le nom qu'a entré l'utilisateur (un simple return _txtNom.Text;)
    * Form1 détecte que Form2 se ferme quand la méthode ShowDialog() se termine
    * Form1 récupère alors le nom entré dans Form2 grâce à la propriété Nom.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    OK nickel et merci pour ces précieux conseils...

    Le cas que tu décris est exactement celui que j'ai codé...
    Comment la form appelante détecte que la form appelée se ferme ?
    Pour mon cas, j'ai passé l'appelante ds le constructeur de l'appelée... et j'ai invoqué la méthode sur l'appelante...

    Enfin, pourrais-tu m'indiquer un bon cours (pdf) ou on explique comment bien structurer une application ? Un bon cours C#...

    Merci beaucoup.

  9. #9
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par the java lover
    Comment la form appelante détecte que la form appelée se ferme ?
    Pour mon cas, j'ai passé l'appelante ds le constructeur de l'appelée... et j'ai invoqué la méthode sur l'appelante...
    dans le cas d'un showdialog(), la form 1 est bloquée tant que la form 2 n'est pas fermée. Donc le code en dessous de showdialog() dans form1 sera executé forcement quand form2 sera fermée.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  2. accéder à une méthode de l'ActionForm depuis une jsp
    Par bags1509 dans le forum Struts 1
    Réponses: 2
    Dernier message: 25/02/2008, 13h42
  3. je ne trouve plus le menu pour invoker une méthode depuis VS2005
    Par jerome.fortias dans le forum Visual Studio
    Réponses: 3
    Dernier message: 28/08/2007, 16h56
  4. accès a un attribut d'une mdi depuis les forms filles
    Par Taaroa dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/06/2007, 16h20
  5. [FLASH MX] Accéder à une BD depuis Flash sans php
    Par samanderson dans le forum Flash
    Réponses: 2
    Dernier message: 16/01/2006, 20h04

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