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 :

[C#] Exécuter une fonction sur une form parente


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 58
    Points : 42
    Points
    42
    Par défaut [C#] Exécuter une fonction sur une form parente
    Bonjour,
    Voila je cherche la solution pour exécuter une fonction sur une form à partir d'une autre.

    J'ai une form d'instance "fObjet". A partir de ce form, j'en ouvre une autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    formCombo fCombo = new formCombo(combo);
    fCombo.Show();
    Et donc j'aimerais exécuter une fonction de la form "fObjet" depuis "fCombo".
    Une bonne âme saurait m'aider?

    Mercchhiii

  2. #2
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Je crois qu'une recherche sur le forum te sortira les éléments dont tu as besoins car il me semble que ce genre de questions a été traité maintes fois.
    Tu peux commencer par regarder ici et aussi ce lien

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Tu modifies le constructeur de FormCombo pour qu'il prenne comme 2ème paramètre ta fiche parent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class FormCombo
    {
    private FormParent parent_;
     
    public FormCombo(Combo combo, FormParent parent)
    {
        parent_ = parent;
    }
    Et tu appelles FormCombo comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormCombo fCombo = new FormCombo(combo, this);
    fCombo.Show();

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 122
    Points
    3 122
    Par défaut
    si je puis me permettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class FormCombo
    {
    private FormParent parent_;
     
    public FormCombo(Combo combo, FormParent parent)
        :this()
    {
        parent_ = parent;
    }
    sinon, le InitializeComponent() n'est jamais appelé

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut, je crois la méthode la plus facile est de faire comme ceci :
    1. D'abords tu instancies ton form c'est à dire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      formCombo fCombo = new formCombo();
    2. Tu mets la propriéteé owner du form fCombo à la valeur du présent form d'ou tu as instancié
    3. Tu ouvres ton form fCombo
    4. Pour appeler une méthode publique de ton form fObjet tu écris dans le code de ton form fCombo ceci :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      (this.owner as FormObjet).MaMethodePublique();


    Tu n'as besoin de surchargé le constructeur.

    1, 2 et 3 sont à faire dans le form FormObjet et 4 dans le code de FormCombo

  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
    Bien. Mais ça pète une NullReferenceException si jamais t'as une form dont le type n'est pas FormObjet qui ouvre ta fCombo...

    Pour un petit projet, la solution qui consiste à passer la form appelante en paramètre est acceptable. Au moins, elle est dans le bon type.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Au lieu de faire un fCombo.Show tu mets à la plasce un ShowDialog comme ça le form Parent existera tant que fCombo est affiché.
    Et alors ça ne va pas :
    Bien. Mais ça pète une NullReferenceException si jamais t'as une form dont le type n'est pas FormObjet qui ouvre ta fCombo...

  8. #8
    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
    Tu as mal compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this.owner as FormObjet).MaMethodePublique();
    ne fonctionne que si l'owner est du type FormObjet. Sinon, l'opérateur as renverra null, et null.UneMéthode() => NullReferenceException.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    si je puis me permettre :

    ...

    sinon, le InitializeComponent() n'est jamais appelé
    Tu puis

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ok.
    Dans tous les cas si on ouvre la form FormCombo en faisant appel au ShowDialog() alors le form de type FormObjet existera toujours tant que le form de type FormComo n'est pas fermé.

    Donc pas de reférence nulle.

  11. #11
    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 h2s84 Voir le message
    Ok.
    Dans tous les cas si on ouvre la form FormCombo en faisant appel au ShowDialog() alors le form de type FormObjet existera toujours tant que le form de type FormComo n'est pas fermé.

    Donc pas de reférence nulle.
    Relis ce que j'ai écrit :
    Sinon, l'opérateur as renverra null, et null.UneMéthode() => NullReferenceException.
    Eviter dans la mesure du possible les objets trop fortement couplés, qui se mettent à plus marcher quand on les utilise dans un scénario différent de celui du départ.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Merci mon supérieur membre émerité dénommé mon altesse Guulh.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Salut, je crois la méthode la plus facile est de faire comme ceci :
    1. D'abords tu instancies ton form c'est à dire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      formCombo fCombo = new formCombo();
    2. Tu mets la propriéteé owner du form fCombo à la valeur du présent form d'ou tu as instancié
    3. Tu ouvres ton form fCombo
    4. Pour appeler une méthode publique de ton form fObjet tu écris dans le code de ton form fCombo ceci :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      (this.owner as FormObjet).MaMethodePublique();


    Tu n'as besoin de surchargé le constructeur.

    1, 2 et 3 sont à faire dans le form FormObjet et 4 dans le code de FormCombo
    Malgré différents essais dont celui repris ci-dessus, cela s'avère toujours infructueux. Bizarre. EN fait il ne reconnait pas les fonction (et même variables) déclarées publiques dans mon formObjet...

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Le code qui ne fonctionne pas serait le bienvenu pour t'aider, nous ne sommes pas devins...

  15. #15
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 122
    Points
    3 122
    Par défaut
    un petit détour par les event ?

    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
     
    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;
     
    namespace Appel_fonctions_interforms
    {
        public partial class FormMain : Form
        {
            public FormMain()
            {
                InitializeComponent();
            }
     
            private void AjouterTexte(object sender, AjoutElementEventArgs e)
            {
                listBox1.Items.Add(e.Text);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                using (FormAppelante formAppelante = new FormAppelante())
                {
                    formAppelante.OnAjoutElement += new AjoutElementEventHandler(AjouterTexte);
                    formAppelante.ShowDialog();
                }
            }
     
        }
    }
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    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;
     
    namespace Appel_fonctions_interforms
    {
        public partial class FormAppelante : Form
        {
     
            public event AjoutElementEventHandler OnAjoutElement;
     
            public FormAppelante()
            {
                InitializeComponent();
            }
     
            private void textBox1_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (OnAjoutElement != null)
                    {
                        OnAjoutElement(this, new AjoutElementEventArgs(textBox1.Text));
                    }
                }
            }
     
     
        }
     
        public class AjoutElementEventArgs : EventArgs
        {
            private string text;
            public string Text
            {
                get { return text; }
                set { text = value; }
            }
     
            public AjoutElementEventArgs(string texte)
            {
                text = texte;
            }
        }
     
        public delegate void AjoutElementEventHandler(object sender, AjoutElementEventArgs e);
     
    }
    Fichiers attachés Fichiers attachés

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Désolé de ne plus avoir répondu. Le problème est résolu. Pas bien compris pourquoi. Une compilation plus tard cela fonctionnait...

    Merci à tous pour vos réponses.

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. Réponses: 5
    Dernier message: 18/11/2007, 01h15
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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