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 méthode d'une Form depuis une autre ? (Invoke ? Ref ?)


Sujet :

C#

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut Appeler méthode d'une Form depuis une autre ? (Invoke ? Ref ?)
    Bonjour,

    Je galère un peu ...

    Concrètement, j'ai 2 forms :

    - Form1 (ma fenêtre principale).
    - OptionForm (ma fenêtre secondaire, appellée par Form1).

    Lorsque je vais appuyer sur le bouton "OK" de la OptionForm, il faut que Form1 exécute une méthode particulière qui va relancer l'initalisation de certaines données internes.

    Comment faire pour que ce soit le plus rapide et léger possible ?

    - Passer en paramètre (par référence) Form1 à OptionForm ? (Mouais ... pas top !)
    - Utilisation de la méthode "Invoke" appellée à partir d'un FormCollection ? (Mais alors cela nécéssite des delegate... Je n'arrive pas à mettre en place ce système et l'utiliser depuis ma 2ieme form).

    - Création d'un Event ? heuuu oui comment ?

    Avez-vous des solutions concrètes à me proposer ?

    Pour modifier un élément (TextBox ou autre, j'utilise le Controls["textBox1"].Text = "blabla" ) , mais pour les méthodes ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ca dépend de la relation entre tes forms.
    Si tu fermes ton OptionForm à l'appui sur OK, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    using (OptionForm f = new OptionForm())
    {
      if (f.ShowDialog() == DialogResult.Ok)
      {
      // ton code, qui se déclenchera après l'appui sur OK
      }
    }
    suffit. Sinon, si ta deuxième form n'est pas une boîte de dialogue (ie affichée avec un Show au lieu d'un ShowDialog), ou si tu veux qu'elle agisse sur ta form principale avant sa propre fermeture, tu peux te diriger vers des event.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    using (OptionForm OptionForm f = new OptionForm())
    {
      f.TonEvent += taFonction;
     f.ShowDialog();
    }
     
    private void taFonction(object sender, TonEventArgs e)
    {
    // ton code
    }
    et zou.
    ಠ_ಠ

  3. #3
    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
    EDIT: tir croisé avec Guulh

    La solution est beaucoup plus simple que ce que tu décris ci-dessus

    1. Dans OptionForm, en supposant que tes boutons OK et Annuler s'appellent respectivement btnOK et btnCancel :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      btnOK.DialogResult = DialogResult.OK;
      btnCancel.DialogResult = DialogResult.Cancel;
      (tu peux aussi passer par le Designer pour positionner cette propriété)
    2. Dans Form1 :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      OptionForm op = new OptionForm();
      if (op.ShowDialog() == DialogResult.OK)
      {
          LaMethodeQuiInitialiseLesDonnees();
      }


    Si tu as besoin de récupérer certaines infos de OptionForm, tu peux déclarer des propriétés publiques dans OptionForm, qui renvoient les valeurs des contrôles. Par exemple, si tu as une checkbox qui s'appelle chkOption1, tu peux créer une propriété Option1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public bool Option1
    {
        get { return chkOption1.Checked; }
        set { chkOption1.Checked = value; }
    }
    Et tu peux ensuite utiliser cette propriété à partir de Form1. En reprenant l'exemple ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OptionForm op = new OptionForm();
    if (op.ShowDialog() == DialogResult.OK)
    {
        LaMethodeQuiInitialiseLesDonnees(op.Option1, ....);
    }

  4. #4
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Moi, ce qui me plairait bien c'est un event sur ton OptionForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class OptionForm 
    {
      public delegate void UnEvent(avec éventuellement des paramètres);
      public event UnEvent OnUnEvent;
     
      private void button4_Click(object sender, EventArgs e)
      {
        if (OnUnEvent != null) //Être sûr que qqun s'y est abonné
        {
          OnUnEvent(paramètres);
        }
      }
    }
    Puis dans ta form principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonOptionForm.OnUnEvent+= new OptionForm.OnUnEvent(MonOptForm_OnUnEvent);
     
    MonOptForm_OnUnEvent(paramètres)
    {
      Ton code de gestion ici...
    }
    C'est-y pas beau tout ça

  5. #5
    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
    C'est beau... 3 réponses, 3 approches différentes

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est beau... 3 réponses, 3 approches différentes
    Faut dire que m'sieur ExSter devra nous fournir plus de précisions sur le comportement attendu pour avoir une réponse qui corresponde pile poil à son besoin
    ಠ_ಠ

  7. #7
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut
    Parfait !

    Informations détaillées pour des cas de figures différents.

    Pour mon cas :
    En effet, j'ai dans OptionForm, un bouton OK (bOK) et un bouton Annuler (bAnnuler).

    Lorsque le bouton OK est pressé, l'OptionForm va modifier les valeurs d'une autre classe appellée ENGINE (ma classe moteur, contenant toutes les méthodes et propriétés utilisée par mes différentes forms) ET la form principale doit RECHARGER une méthode d'initialisation de certains composants visuels (des labels, etc.).

    J'ai donc opté pour la solution proposée suivante :

    Dans le constructeur de OptionForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    btnOK.DialogResult = DialogResult.OK;
    btnCancel.DialogResult = DialogResult.Cancel;
    Ensuite, dans ma Form1 (form principale, appelante) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OptionForm op = new OptionForm();
    if (op.ShowDialog() == DialogResult.OK)
    {
        LaMethodeQuiInitialiseLesDonnees();
    }

    Mais pour d'autres Forms, je vais implémenter le système d'EVENTs et DELEGATE.
    Celui-ci me parait fondamental et optimisé pour mon utilisation.


    Merci à tous pour votre aide.

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

Discussions similaires

  1. Accès à une méthode d'une form depuis une autre autre form
    Par arngrimur dans le forum Windows Forms
    Réponses: 16
    Dernier message: 13/01/2012, 15h45
  2. Réponses: 6
    Dernier message: 10/06/2010, 15h31
  3. [BCB6]Appel d’une form depuis une form avec showmodal
    Par almisuifre dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/11/2006, 19h14
  4. Accéder au DataSet d'une form depuis une autre
    Par Lucien dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/08/2006, 08h40
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

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