none
Utiliser des objets d'une form à une autre RRS feed

  • Question

  • Bonjour, j'ai un petit souci, j'ai 2 form, j'aimerai savoir comment je peux faire pour par exemple de ma form 1 faire afficher du texte dans mon Label qui se trouve dans la form 2. J'ai bien réussi à le faire en vb mais la j'ai besoin de le faire en C#, or à ma grande surprise on n'a pas accès aux éléments graphique directement.

    Voici le code que j'avais en VB :
    form2.Label1 = "coucou"
    
    Donc ce code fonctionne en vb mais en C# ça ne passe pas. Comment peut-on résoudre ce problème?

    Cordialement, maxkun ;)

    lundi 23 juillet 2012 11:14

Réponses

  • Concrètement quel est le message que vous avez quand vous tapez le code et quel est le code que vous tapez ?

    Chez moi, c'est Private par défaut et cela marche avec internal. J'ai par exemple :

       private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.Owner = this;
                f.Show();
            }

    dans l'appelant et

                Form1 f = (Form1)Owner;
                f.label1.Text = "Hello";
    

    dans l'appelé. On peu donc aussi changer et mettre dans l'appelant :

     public string Titre
            {
                get{return label1.Text;}
                set{label1.Text=value;}
    
            }

    et dans l'appelé :

                Form1 f = (Form1)Owner;
                f.Titre = "Hello";
    

    L'appelé n'a donc plus besoin de savoir que c'est un libellé dont le nom est label1. Il se contente de définir le titre et c'est le formulaire d'origine qui se charge de le placer où il faut dans le bon contrôle etc... et donc demain on pourrait changer le nom ou même le type de contrôle sans que cela ait aucune conséquence ailleurs... L'idée général est de montrer juste ce dont on a besoin. Form2 n'a pas besoin de savoir que c'est un label et c'est son nom. Il a juste besoin de savoir qu'il peut changer un texte présent qq part sur Form1 et c'est Form1 qui a besoin de savoir quoi faire de ce texte...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse maxkun mardi 24 juillet 2012 05:58
    lundi 23 juillet 2012 12:56
    Modérateur
  • En fait quand je déclare juste ceci :

    Form1 f= new Form1();
    J'arrive à avoir accès aux éléments graphique de form1. Si je laisse mon code comme cela je risque d'avoir des problèmes par la suite?


    Cordialement, maxkun ;)

    • Marqué comme réponse maxkun mardi 24 juillet 2012 05:58
    lundi 23 juillet 2012 13:17

Toutes les réponses

  • Bonjour,

    Eventuellement dans les propriétés du contrôle voir la propriété "Modifiers" qui indique la portée des contrôles (ils sont sans doute "privés" par défaut).

    Il reste souvent conseillé de créer :
    - soit sa propre propriété : si par exemple on change le nom du contrôle ou même son type, on pourra toujours faire form2.Propriété="Coucou"; la propriété se chargeant d'aller mettre la valeur dans le contrôle voulu
    - soit même un objet général qui gère ces réglages et pourra éventuellement répercuter ce changement sur tous les formulaires qui le veulent sans avoir à le faire explicitement à chaque fois (MesDonnées.Titre="Coucou" et tous les formulaires qui utilisent ce titre se mettent à jour avec ce nouveau titre).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 23 juillet 2012 12:21
    Modérateur
  • La propriété "Modifiers" est à internal, sinon avez vous des petits exemple de code pour vos exemples? Car je ne vois pas trop comment vos exemple :s

    Cordialement, maxkun ;)

    lundi 23 juillet 2012 12:32
  • Concrètement quel est le message que vous avez quand vous tapez le code et quel est le code que vous tapez ?

    Chez moi, c'est Private par défaut et cela marche avec internal. J'ai par exemple :

       private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.Owner = this;
                f.Show();
            }

    dans l'appelant et

                Form1 f = (Form1)Owner;
                f.label1.Text = "Hello";
    

    dans l'appelé. On peu donc aussi changer et mettre dans l'appelant :

     public string Titre
            {
                get{return label1.Text;}
                set{label1.Text=value;}
    
            }

    et dans l'appelé :

                Form1 f = (Form1)Owner;
                f.Titre = "Hello";
    

    L'appelé n'a donc plus besoin de savoir que c'est un libellé dont le nom est label1. Il se contente de définir le titre et c'est le formulaire d'origine qui se charge de le placer où il faut dans le bon contrôle etc... et donc demain on pourrait changer le nom ou même le type de contrôle sans que cela ait aucune conséquence ailleurs... L'idée général est de montrer juste ce dont on a besoin. Form2 n'a pas besoin de savoir que c'est un label et c'est son nom. Il a juste besoin de savoir qu'il peut changer un texte présent qq part sur Form1 et c'est Form1 qui a besoin de savoir quoi faire de ce texte...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse maxkun mardi 24 juillet 2012 05:58
    lundi 23 juillet 2012 12:56
    Modérateur
  • En fait quand je déclare juste ceci :

    Form1 f= new Form1();
    J'arrive à avoir accès aux éléments graphique de form1. Si je laisse mon code comme cela je risque d'avoir des problèmes par la suite?


    Cordialement, maxkun ;)

    • Marqué comme réponse maxkun mardi 24 juillet 2012 05:58
    lundi 23 juillet 2012 13:17
  • Si cela marche, laissez peut-être comme cela pour l'instant.

    Gardez juste en mémoire que des solutions un peu plus sophistiquées existent si :
    1) vous commencez à avoir beaucoup de modifications entre formulaires. Chaque modification risque de devenir difficile car pourra casser du code existant qui est alors à reprendre. Cela sera plus facile si chaque formulaire en sait le moins possible sur les autres formulaires (et notamment pas le detail des contrôles présents sur tel ou tel formulaire).

    2) éventuellement même ne sait rien du tout. Par exemple un formulaire peut décider de modifier le titre de l'application et l'indiquera à un objet central. Chaque formulaire se sera éventuellement "abonné" à ce changement pour récupérer la valeur et se mettre à jour si besoin. De cette façon chaque formulaire s'occupe de lui même et cela sera plus facile que de devoir, dans le formulaire mettant à jour cet info, se soucier de mettre à jour directement tous les autres formulaires qui pourraient avoir besoin de cette information.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 23 juillet 2012 16:53
    Modérateur