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 :

Modifier Textbox d'une form dans une autre form


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut Modifier Textbox d'une form dans une autre form
    Bonjour tous le monde,

    J'aimerai savoir comment faire pour modifier le textbox d'une forms ( le texte) a partir d'une autre forms.

    En faite j'ai une forms A qui ouvre une forms B. La forms B contien un listbox remplis avec des donnés. La personne selectionne quelque chose dans le listbox et fait OK. J'aimerai qui s'affiche dans le textbox de la forms A ce que l'usager à selectionné dans le listbox de la forms B.

    merci d'avance pour vos reponse.

  2. #2
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    quand tu ajoutes des controls dans un form, les membres créés sont par défaut à private, tu peux faire une méthode dans ton form A pour mettre à jour ton champ de text, pour éviter des erreurs d'accès inter threads (il se peut que ton form B soit dans un thread différent que le form A) il y a une astuce :

    dans FormA.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public delegate void delegateUpdateTextBox(string text);
    public void updateTextBox(string text){
        if(this.InvokeRequired){
            delegateUpdateTextBox deleg = new delegateUpdateTextBox(this.udateTextBox);
            this.Invoke(deleg, new object[]{text});
        }else{
            this.maTextBox.Text = text;
        }
    }
    et dans ton Form B tu mets un événement sur le bouton sur lequel tu fais OK et tu appelles ta méthode du form A

    Dans FormB.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void ButtonOk_Click(object sender, EventArgs e){
        string text;
        //tu récupères ton texte que tu veux afficher dans ton Form A
        //on suppose que formA est une instance de ton Form A
        formA.updateTextBox(text);
    }
    Sous condition, bien sûr, que dans ton form B tu aies une instance du Form A

    NOTE : il se peut que dans le code que j'ai mis il y ait des erreurs de syntaxe mais le principe il est là

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Plus simple (mais beaucoup le déconseilleraient) :
    à la conception, mettre la proprité "modifiers" de la listbox à "internal" ou "public".

  4. #4
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Plus simple (mais beaucoup le déconseilleraient) :
    à la conception, mettre la proprité "modifiers" de la listbox à "internal" ou "public".
    en effet plus simple, mais si tu te retrouves avec des exceptions du genre "opération inter thread non valide" tu sais d'où ça vient et comment le résoudre

  5. #5
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    Sauf erreur de ma part, les différents formulaires (toute l'UI) est manipulée par le même thread donc pas de problème d'opération inter-thread, à ne pas confondre avec les risques d'opération inter-thread lors de l'utilisation de certains composants (notamment le backgroundworker) ou la création explicite de traitements dans un autre thread, traitement qui manipule certains contrôles.

    Sinon pour éviter d'exposer un contrôle comme le suggère Graffito, placer une propriété en lecture-seule sur le textbox (ou juste sur sa propriété Text, selon le besoin).

    Cordialement !

  6. #6
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Par défaut
    La réponse de polkduran est idéal mais peut s'avérer un peu lourde si tu n'utilises pas de multi-thread.

    Comme l'a souligné Graffito, tu peux ouvrir un controle avec un modifier public.
    L'une des raisons pour laquelle on pourrait le déconseiller c'est qu'il n'y a aucun moyen de contrôler au niveau de la Form les informations qui rentrent et sortent. C'est donc la porte ouverte à tout sans possibilité de se rattraper. N'importe quel code peut aller écrire n'importe quoi (voir carrément modifier le comportement du controle).
    Si c'est une application internet, c'est l'utilisateur qui pourrait en profiter (desktop aussi mais moindre).

    Pour reprendre la solution de polkduran en plus simple (mais moins passe partout), créer une méthode qui prends la valeur en paramètre :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void updateTextBox(string text){
        this.maTextBox.Text = text;
    }

    L'autre solution, c'est d'ouvrir une propriété :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public string textBoxValue{
        get
        {
            return this.maTextBox.Text;
        }
     
        set
        {
             this.maTextBox.Text = value;
        }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void ButtonOk_Click(object sender, EventArgs e){
        // Pour reprendre l'exemple de polkduran, avec une propriété
        string text = "";
        formA.textBoxValue= text;
    }
    Ces 2 approches t'autorisent si besoin à rajouter du code pour controler les données en entrée ou en sortie en un point de l'application.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    pas de soucis interthread possible ici ...

    en vb.net les controles sont déclaré par défaut en internal
    après c'est au choix, soit faire un constructeur sur B qui prend une intance de A et ensuite setter a.textbox.text
    ou alors faire un fonction dans B qui fera .showdialog et qui retourne le string (et A pourra alors se le mettre tout seul)
    ou encore faire un fonction dans B qui retourne le string en question, et quand A sait que B est fermé (formclosing) elle va lire la fonction
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    c'est vrai que ma solution est plus générale, dans une possible mise à jour du control depuis un autre thread (qui se situerait en dehors du thread UI, pas forcement via le Form B),
    Mais pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    Merci beaucoup pour vos nombreuse reponse.

    pour la solution de Polkduran je la trouve une peu compliquer puisque je ne sais même pas ce qu'est un thread et comment sa marche.

    J'aime bien la solution de Phelim que je trouve assez simple à comprendre, cependant est-ce que cette solution marche en fermant la forms A et en l'ouvrant apres avoir cliquer sur ok dans la forms B ?

    Pour Pol63 , quand tu dit : "soit faire un constructeur sur B qui prend une instance de A" est ce que sa se fait comme ceci ou je suis dans l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormsB forms = new FormsB(this)
    et ensuite je peut accèder au propriété de la form ? ( je met this mais j'ai jamais vraiment comprit comment et quand utilisé le this )

    et quand tu dit : "ensuite setter a.textbox.text"

    il me semble que j'avait essayer de faire cela et que je n'avait pas textbox dans les choix que propose visual studio apres avoir fait forms.

    Je vait tester vos solution demain, car je n'ai pas visual studio avec moi présentement et je vous en redonne des nouvelles.

    merci beaucoup pour votre aide c'est très apprécier

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    pour le code oui c'est ca

    this représente l'instance dans laquelle s'exécute le code
    si tu es sur un form this vaut donc l'instance de la form

    il faut aussi créer le code du constructeur sur formB qui gardera une référence du form dans une variable

    et pour modifier le textbox, on t'a dit de mettre modifiers à internal ou public (selon si tu as 1 ou plusieurs projets)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    J'en profite pour poser une petite question qui vien de me passer par la tête.

    Est-il possible de faire retourné une valeur a la forms ?

    Par exemple il y a 2 bouton un bouton yes et un bouton no. Est-il possible de faire que si l'usager a cliquer sur oui on retourn true et s'il a cliquer sur non on retourn false ?
    (Je sais que pour mon exemple un messagebox ferait l'affaire mais c'est seulment un exemple )

    merci

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    via un showdialog oui, parce que c'est bloquant
    il y a alors 2 méthodes :

    (désolé si la syntaxe est pas super, je fais du vb.net à l'origine (sans ";" toussa ...))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    formA f = new formA
    result = f.showdialog
    et dans formA sur le bouton ok faire this.dialogresult = ok (ou autre valeur de retour sur les autres boutons)
    setter dialogresult a pour effet de fermer la fenetre (close), il faut ensuite la disposer

    ou alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    formA f = new formA
    result = f.GetValue
    et dans formA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private boolean _returnvalue
     
    function GetValue
    {
    this.showdialog
    return _returnvalue
    }
     
    et sur buttonok_clicked faire _returnvalue = true; this.close;
    showdialog est bloquant (le code attend la fermeture de la fenêtre pour continuer (bloquant mais pas trop quand meme, les events fonctionnent normalement))
    le fait de closer la form fait qu'on passe sur la ligne return _returnvalue
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    Je croit que je vait utilisé ton premier exemple puisque je ne comprend pas vraiment le deuxiemme exemple.

    C'est surtout la fonction GetValue qie je ne comprend pas tu fait un showdialog et tu fait un return de la valeur qui va être générer par le bouton. Sa veux dire que le return attend qu'un bouton soit cliqué ? Comment sa se fait qu'il attent c'Est ce que je ne comprend pas.

    A moin que les return dans les forms soit seulment lit une fois que le forms.close a été appeler ?

    merci de m'éclairer la dessus

    PS: est -ce que le "_" devant ta variable _returnvalue fait quelque chose de spécial ou c'est seulement pour le nom ? (J'ai jamais aimer cette syntaxe)

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    pour le _ c'est une des conventions possibles pour les variables privées (et les reconnaitre rapidement donc)

    sinon pour l'exemple, fait du pas à pas avec un showdialog et tu verras que ca ne passe pas à la ligne d'après tant que la fenêtre est ouverte, ce n'est donc pas le return qui fait patienter
    le return ne sera alors exécuté qu'après la fermeture de la fenêtre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    Salut,

    j'ai finalement essayer de mettre mes textbox en internal et ensuite d'appeler ma formsB avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormsB form = new FromsB;
    form.showdialog();
    ensuite dans la formsB je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormsA form = new FormsA();
    form.textbox1.text = "Salut";
    Le texte de mon textbox ne change pas.

    Est-ce que je fait quelque chose de mal ?

  16. #16
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Il faut passer FormA à FormB et non créer une nouvelle instance de FormA dans FormB.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FormsB form = new FromsB;
    form.ParentForm = this ;
    form.showdialog();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    internal FormsA ParentForm = null ;
    ...
    ParentForm.textbox1.text = "Salut";

  17. #17
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    on ne peut pas assigner quelque chose a parentForm et quand j'essais avec parent il me dit :

    Impossible d'ajouter un contrôle de premier niveau à un contrôle.
    desolé pour tous ces problèmes , je ne suis qu'un débutant et je ne comprend pas tous les code que vous utilisé.

    Il faut dire que je me suis compliquer un peux plus la vie puisque maintenant. J'ai une formA qui appèle une formsB avec un chois et si l'usager choisi le chois pour la liste la je fait apparaitre la formsC qui devrai pouvoir modifier le textbox de la formsA

    Il y a une chose que je ne comprend pas. Le this n'équivaut pas a l'instance ou on est ? Alors pourquoi je ne peut pas tous simplement faire une instance ?

  18. #18
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    "ParentForm" était un nom mal choisi puisqu'il s'agit aussi de celui d'une propriété des Control .

    Donc, à remplacer par un autre nom comme "CallingForm".

  19. #19
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    Je vais essayer de te faire comprendre le principe de la démarche avec la façon dont j'ai résolu ton souci en pas à pas:

    J'ai créé deux Form (appelés FormA et FormB).
    Sur FormA j'ai mis un TextBox (textBox1) et un bouton (buttonToFormB).
    Sur FormB j'ai mis un ListBox (listBox1) que j'ai rempli (manuellement) de trois lignes pour tester ; ainsi que deux boutons (buttonValidateReturnToFormA et buttonCancelReturnToFormA).
    Dans les propriétés de FormB j'ai spécifié buttonValidateReturnToFormA à la propriété AcceptButton et buttonCancelReturnToFormA à la propriété CancelButton. De plus j'ai positionné la propriété DialogResult du premier bouton à "OK" et celle du deuxième à "Cancel" ; ceci permet de dire quelle sera la valeur "renvoyée" par le Formulaire.
    Ensuite dans le code de FormB j'ai rajouté une propriété de type string qui renvoie le texte sélectionné de la listbox (ou N/A si aucun n'est sélectionné, à voir comment toi tu veux gérer ce cas) comme ceci:
    Code C# : 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
     
    public string ListBoxText
    {
        get
        {
            return (listBoxFormB.SelectedItem ?? "N/A").ToString();
            // Si tu as du mal à comprendre cette instruction tu peux aussi faire comme ceci:
            /*if (listBoxFormB.SelectedItem == null)
            {
                return "N/A";
            }
            else
            {
                return listBoxFormB.SelectedItem.ToString();
            }*/
        }
    }
    Enfin dans l'évènement clic sur le bouton dans FormA j'ai fait:
    Code C# : 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
     
    // Note dans le cas d'un copier/coller du code ne pas oublier "d'enregistrer" l'évènement
    // dans le constructeur par exemple avec
    // buttonToFormB.Click += new EventHandler(buttonToFormB_Click);
    private void buttonToFormB_Click(object sender, EventArgs e)
    {
        // Form implémente IDisposable, il vaut donc toujours mieux utiliser using
        using (FormB fb = new FormB())
        {
            // Récupère la "valeur de retour"
            DialogResult dr = fb.ShowDialog(this);
            if (dr == DialogResult.OK) //Si celle-ci est OK (donc renvoyée par le bouton buttonValidateReturnToFormA)
            {
                // Accès à la propriété créée plus tôt
                textBoxFormA.Text = fb.ListBoxText;
            }
            else
            {
                // Ici traiter le cas où on a cliqué sur buttonCancelReturnToFormA
                // (ou fermé la fenêtre avec la croix) si besoin est.
            }
        }
    }

    Voilà j'ai essayé de détailler, en cherchant à ne pas trop compliquer (même si j'ai certaines habitudes tenaces ) en espérant que cela aide

    Cordialement !

  20. #20
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2010
    Messages : 69
    Par défaut
    Merci beaucoup Sehnsucht,

    C'était très bien expliquer.

    J'ai une seul petite interogation. Le this que tu passe dans le showdialog il faut que tu le récupère dans le constructeur de la formsB ?


    je trouve cette ligne vraiment interessante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (listBoxFormB.SelectedItem ?? "N/A")
    les ?? voudrai donc dire si null vaux n/A ?

    merci grandement pour ton aide

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. comment avoir une valeur d'une form1 dans un autre form
    Par sabrina_beautyful dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2009, 14h53
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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