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 :

[C#] Accès aux controls d'un formulaire à partir d'un autre formulaire


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [C#] Accès aux controls d'un formulaire à partir d'un autre formulaire
    Bonjour, j'ai réalisé un petit programme simple pour mieux visualiser mon problème. J'ai une application qui contient 3 formulaires. Le premier ne sert qu'à ouvrir l'application et à ouvrir un deuxième formulaire. Sur ce deuxième formulaire, j'ai un bouton pour ouvrir un troisième formulaire ainsi qu'un bouton qui sert à afficher un texte dans un label. Sur le troisième formulaire j'ai un bouton qui devrait activer le bouton du deuxième formulaire pour afficher un texte, ceci via un PerformClick(). Voici le code:
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    //Premier formulaire
    namespace WindowsFormsAppTest
    {
        public partial class frmFormulaire1 : Form
        {
            public frmFormulaire1()
            {
                InitializeComponent();
            }
            private void btnBouton1_Click(object sender, EventArgs e)
            {
                frmForm2 noForm2 = new frmForm2();
                noForm2.Show();
            }
            private void btnExit_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }
        }
    }
    //Deuxième formulaire
    namespace WindowsFormsAppTest
    {
        public partial class frmForm2 : Form
        {
            public frmForm2 Form2 { get; private set; }
            public frmForm2()
            {
                InitializeComponent();
            }
            private void frmForm2_Load(object sender, EventArgs e)
            {
                //btnBouton4.PerformClick();
            }
            private void btnBouton2_Click(object sender, EventArgs e)
            {
                frmForm3 noForm3 = new frmForm3(Form2);
                noForm3.Show();
            }
            private void btnBouton4_Click(object sender, EventArgs e)
            {
                lblInfos.Text = "Activation du label";
            }
        }
    }
    //Troisième formulaire
    namespace WindowsFormsAppTest
    {
        public partial class frmForm3 : Form
        {
            private frmForm2 _frmForm2 = new frmForm2();
     
            public frmForm3()
            {
                InitializeComponent();
            }
            public frmForm3(frmForm2 Form2)
            {
                InitializeComponent();
                //Sauvegarder l'instance de frmForm2
                this._frmForm2 = Form2;
             }
            private void btnExit_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            private void btnBouton3_Click(object sender, EventArgs e)
            {
                _frmForm2.btnBouton4.PerformClick();
            }
        }
    }
    Dans cette version, je reçois un message NullReferenceException au niveau du PerformClick(). Si un formulaire est instancier, ses controls ne le sont pas automatiquement ?
    Merci pour vos éventuelles réponses.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2022
    Messages : 13
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Je regarde votre code rapidement, et le problème m'a l'air évident (sans en être sur à 100% car non testé).

    Sur votre formulaire frmForm2 vous avez une propriété 'Form2' qui n'est jamais instanciée !?

    Vous passez cette propriété au formulaire frmForm3 via le constructeur.
    Le formulaire frmForm3 instancie bien sa propriété _frmForm2 ... mais vous l'écrasez ensuite dans le constructeur.

    Au final vous écrasez l'instance de _frmForm2 par un 'null' ; et à l'utilisation vous vous mangez un "NullReferenceException".

    Pour solutionner votre problème il faut passer directement l'instance de votre deuxième formulaire au troisième comme ceci :
    frmForm3 noForm3 = new frmForm3(this);

    ... et supprimer les propriétés qui ne servent plus à rien.

    Je me permet au passage de vous dire que d'appeler des méthodes (ou lever des évènements) directement d'un formulaire vers un autre n'est pas très recommandé.
    Pour faire plus propre je vous proposerai de créer des classes à coté pour gérer la partie métier du programme et conserver vos IHM pour l'affichage uniquement.

    Deuxième point : utilisez des noms de classe, de variable et de méthode qui soient plus claires, vous vous y retrouverez beaucoup mieux.

    Cordialement.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private Form1 _Form1Intance;
     
    public Form2(Form1 form1Instance)
    {
        InitializeComponent();
        _Form1Intance = form1Instance;
    }
     
    // _Form1Intance.Button1.text = "nouveau texte"; // là ca va fonctionner car on a _Form1Intance qui est remplie (donc pas null), et avec l'instance appelante
    et depuis Form1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var f = new Form2(this);
    f.Show();
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre réponse mais depuis après de multiples recherches j'ai trouvé la source de mes erreurs, la même que vous avez décelée.
    Merci aussi pour vos conseils judicieux en ce qui concerne la partie métier.

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

Discussions similaires

  1. [Débutant] Accès aux controle d'un formulaire
    Par michel.semal dans le forum C#
    Réponses: 5
    Dernier message: 30/12/2017, 21h00
  2. Réponses: 5
    Dernier message: 27/07/2011, 16h56
  3. Accés aux controls d'un formulaire créé par new
    Par Abdou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/08/2008, 23h07
  4. Accès aux controles dans un formulaire
    Par tonton67 dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/03/2008, 13h10
  5. [VB.net] Acces aux controles d'une form a partir d'une autre
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/01/2006, 12h47

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