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#][UserControl]Communication WinForm <> UserControl


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut [C#][UserControl]Communication WinForm <> UserControl
    Bonjour,

    Mon application est constituée d'une form principale qui dispose d'un minimum de contrôles dont un champ texte et un panel dans lequel je charge des contrôles utilisateurs. Depuis un UC, lors d'un évenement OnClick sur un bouton je souhaite valider des données saisies dans le formulaire contenu dans l'UC. Jusque là rien d'exotique... Mais j'aimerais pouvoir afficher un message (en cas d'erreur de la validation notemment) dans le champ texte de la form principale. But How ???? Sachant que je créé mon Uc juste au moment où je souhaite le charger.
    Je comprends bien que dans le code de mon Uc, la form principale est inconnue, ainsi que le champ texte.
    Donc comment réaliser une telle action svp (qui me semble triviale pourtant ....) ?

    Merci d'avance
    B.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    deux solutions que je vois possible :

    1/ L'UC connait le main Form.. donc, dans ton UC, tu as une référence au main qui lui est passé lors de sa construction

    2/ Le traitement de validation n'est pas fait dans l'UC mais dans un bout de code
    du main, et c'est le main qui valide et affiche la popup d'avertissement

    The Monz, Toulouse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    deux solutions que je vois possible :

    1/ L'UC connait le main Form.. donc, dans ton UC, tu as une référence au main qui lui est passé lors de sa construction

    2/ Le traitement de validation n'est pas fait dans l'UC mais dans un bout de code
    du main, et c'est le main qui valide et affiche la popup d'avertissement

    The Monz, Toulouse
    Ok, merci pour la rapidité d'intervention :-)

    La solution 1/ est-elle "propre" ? Quand tu parles de référence au main dans le constructeur de l'UC tu parles d'un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            private Form _parent;
            public ucMonUc(Form parent)
            {
                this._parent = parent;
            }
    comme ça je peux travailler sur main depuis l'UC ?
    Me trompe-je ?

    cya
    B.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    non non, tu ne te trompes pas

    Cela te permet de connaitre dans ton UC ton Main

    Maintenant, si ton UC est "un plug-in", il n'est pas "propre" que l'UC connaisse le type de l'objet qu'on lui passe...

    Je veux dire que passer Parent (comme tu l'indiques) est tout à fait faisable, par contre, pour pouvoir appeler une méthode différente des méthodes de base d'une form, il va falloir que dans ton UC, tu saches qu'il s'agit pas d'une form, mais d'une MyForm ou d'une form1 ou autre nom de la classe de ta form

    Une approche plus "propre" est de créer une interface dans laquelle on va trouver les méthodes de validation que l'UC va devoir appeler, et que t'as
    form (quelque soit son nom), implémente cette interface.. Ainsi, dans l'UC, tu n'auras qu'à caster ta form en IMonInterface et basta... (l'avantage en faisant ainsi que ton UC peut etre générer, compiler , sans soucis à partir du moment ou il connait l'interface IMonInterface

    Tu saisies la démarche ?

    The Monz, Toulouse

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    yep, c'est un peu plus touffu mais loin d'être intéressant.
    Bon, je ne te cache pas que pour le moment je vais passer par la référence dans le constructeur, mais j'avais déjà jeté un oeil distrait sur les interfaces et je devrais pouvoir y consacrer un peu de temps !

    Thks !!
    B.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Bon, en fait c'est pas si résolu que ça.....
    Ok, je passe ma form dans mon constructeur de l'Uc mais je n'ai toujours pas accès (depuis l'Uc) à mon champ texte (EditBox) placée dans le forme principale .... J'ai essayé de mettre ce champ en visibilité public dans le designer.cs de ma form mais ça ne passe pas....

    Any idea ?
    B.

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    si la fonction de validation est fournie par le main, pourquoi devoir accéder
    depuis l'UC a des champs du Main ?

    Sinon, au pire, tu fais une méthode public dans ton MainForm qui te renvoie
    la valeur de la textbox

    Par contre, je ne trouve pas cela "joli"....

    Si tu dois exploiter des données dans l'UC, l'idéal serait que l'UC trouve l'information dont il a besoin dans une variable via un accesseurr du Main, et qu'ensuite, le main se charge de "transférer" la donnée venant de la textbox ou autre chose...

    L'interet de faire ainsi est que le jour ou tu changes la nature du controle de saisie (ici une textbox) par un autre composant fournissant le meme resultat mais d'un autre type, tu n'auras pas à toucher ton UC...

    En gros, il faut penser Données et représentation visuel.. ET si possible, faire en sorte que l'on recupere les infos depuis une classe Document plutot que depuis directement un controle qui peut etre sujet à changer de nature



    The Monz, Toulouse

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    si la fonction de validation est fournie par le main, pourquoi devoir accéder
    depuis l'UC a des champs du Main ?

    Sinon, au pire, tu fais une méthode public dans ton MainForm qui te renvoie
    la valeur de la textbox

    The Monz, Toulouse
    Bah non, la fonction de validation est dans l'UC justement !
    D'un autre côté, je peux aussi mettre le champ texte d'affichage de l'erreur dans l'UC directement !

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    deux solutions que je vois possible :

    1/ L'UC connait le main Form.. donc, dans ton UC, tu as une référence au main qui lui est passé lors de sa construction
    Même pas indispensable d'avoir une référence. Depuis l'UC, this.FindForm() va retourner la référence à la Form contenante.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par ben_popcorn Voir le message
    Bah non, la fonction de validation est dans l'UC justement !
    Si la classe de ta form est MyForm, et la zone MyTextZone, dans l'UC tu peux écrire :

    ((MyForm)(this.FindForm())).MyTextZone.Text = "Ca marche !!!";

    Il faut déclarer la zone avec un modifier public, ou, mieux mettre une méthode public WriteToMyTextZone dans MyForm pour y accéder :

    ((MyForm)(this.FindForm())).WriteToMyTextZone("Ca marche !!!");

    Bien sur, cela suppose que ton UC et ta form soit dans la même assembly.(dans le cas contraire, tu peux implémenter au niveau de MyForm une interface définie dans une assembly tierce, connue de l'assembly contenante de MyForm et de l'assembly contenante de l'UC, mais dans ce cas un mécanisme un peu plus sophistiqué est sans doute préférable).

  11. #11
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Le usercontrol ne doit pas connaitre la form. C'est une mauvaise pratique d'accèder à la form depuis le usercontrol.

    Le usercontrol doit être en charge de se valider lui même. Souvent ce que je fait est une method HasErrors() dans mon usercontrol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public bool HasErrors()
    {
     //Validation...
     return true or false
    }
    Ensuite dans ta form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (usercontrol.HasErrors())
      message.show()
    Ou encore si c'est pas trop lourd, tu peux tjrs caller ValidateChildren() depuis ta form qui va lancer un Validate() sur chaqun de ces controls

    Si la classe de ta form est MyForm, et la zone MyTextZone, dans l'UC tu peux écrire :

    ((MyForm)(this.FindForm())).MyTextZone.Text = "Ca marche !!!";
    Ce qui veux dire que si je prend mon usercontrol et que je le met ayeur et que le parent n'a pas de MyTextZone ou WriteToMyTextZone ca plante ? C'est pas tres pratique comme technique!

  12. #12
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2005
    Messages : 64
    Par défaut
    Le usercontrol ne doit pas connaitre la form
    je suis toute a fait d'accord avec ce qui a dit shwin, et j'ajoute qu'on peut créer une autre propriété dans UC qui retourne le texte de l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public string ErrorsText{get{return "texte de l'erreur";}}
    et ainsi vous pouvez mattre dans votre form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (usercontrol.HasErrors())
              MyTextZone.Text=usercontrol.ErrorsText;

  13. #13
    Membre confirmé
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Par défaut
    Salut,
    J'arrive un peu après la guerre mais mes deux cents. J'utilise souvent une petite classe Result qui a 2 properties, boolean IsOk et String Message qui sert dans le genre de situation décrite au dessus.
    En fait j'ai aussi CollectionResult(of T) qui fait la même chose avec des collections
    Un dernier point, pour ne pas coupler la forme à un type de controle il est possible d'utiliser une interface (ex IValidatable ? ). la form peut alors loader des controles differents tant qu'ils respectent les interfaces nécessaires.

    Dom

Discussions similaires

  1. [Débutant] WinForm avec 2 UserControl Custom et gestion des évènements
    Par Cyryior dans le forum C#
    Réponses: 0
    Dernier message: 01/08/2011, 01h09
  2. Communication entre UserControl et winform
    Par topolino dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/06/2009, 16h03
  3. Réponses: 6
    Dernier message: 12/02/2008, 14h56
  4. Communication Winform 2.0
    Par xtiand4 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 12/11/2007, 16h51
  5. [Grid][UserControl] Mise en forme de UserControl dans une Grid
    Par youngBugger dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/10/2007, 10h37

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