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 :

GetFields sur textBox crées dynamiquement


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut GetFields sur textBox crées dynamiquement
    Bonjour,

    En le faisans court : je n'arrive pas a retrouver par réflection les champs crées dynamiquements.

    En le faisant long :

    Supposons que j'ai un textBox (txtBox) sur une winfomrs- dans ma winforms je joue le code de reflection suivant :

    =============================================
    Type MesTypes = this.GetType();
    MemberInfo[] MyMemberInfoArray = MesTypes.GetFields(BindingFlags.Instance
    | BindingFlags.NonPublic
    | BindingFlags.Public
    );

    ...
    ==============================================

    Dans MyMemberInfoArray j'ai bien txtBox. (je le vois en parcourant le tableau et en l'affichant dans la console)

    Maintenant si dans le constructeur de la classe je rajoute

    ==============================================
    TextBox MyTextBox = new System.Windows.Forms.TextBox();
    MyTextBox.Location = new System.Drawing.Point(50, 50);
    MyTextBox.Name = "txtBox";
    MyTextBox.Size = new System.Drawing.Size(130, 20);
    this.Controls.Add(MyTextBox);
    ==============================================

    J'ai bien une nouvelle textBox présente dans mon formulaire mais il n'est pas recensé par le this.GetFields (en ayant joué le même this.getType avant)

    Merci pour votre aide

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    MyTextBox n'est pas un membre de la classe, c'est une variable locale, elle n'est donc pas accessible par réflexion.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci pour votre réponse.

    je fais donc peut être fausse route. Mon souci est d'accéder à des valeurs d'un champ crée dynamiquement.

    Supposons que je crée un textBox dynamiquement à partir d'un nom précisé dans une interface comment (jusque là je sais faire).
    Je remplis le textbox crée

    comment récupérer la valeur de ce champ ?


    merci encore

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    si ta textbox est visible sur la form, elle est referencé dans this.Controls, donc un coup de reflection dessus (ou directement selon les contraintes), et tu auras un ControlCollection (plus sur du nom, enfin bon une collection de controls =p), dans laquelle tu pourras chercher ta textbox.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Je ne pense pas que le text box que l'on rajoute dans le constructeur soit une variable locale. On le déclare dans la méthode (donc là c'est une variable locale), mais à la fin on le rajoute dans le controle (Controls.add...)

    En essayant la suggestion de faire une réflection sur le control lui même (this.Controls.GetType() plutot que this.getType() j'ai exactement la même chose) (merci pour l'idée)

    Peut être n'est il tout simplement pas possible de rajouter des champs en dynamique à une classe (j'ai une classe A avec un champ a, je l'instancie et je rajoute un champ b).

    Mais si c'est le cas à quoi sert cette fichue fonction méthode Add ? Si tout est objet j'ai bien un membre qui est rajouté quelque part....je nage...je nage...

    Merci de votre sollicitude.

  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
    J'ai l'impression que tu confonds deux choses : les champs d'une classe, et les objets d'un conteneur.
    Il se trouve que dans le cas des winform générées par le designer, ces deux concepts se recouvrent : quand on ajoute une textbox dans le designer à une form, une variable membre est créée (this.textbox1), et elle est ensuite ajoutée à une liste propre à la form (this.Controls). Mais d'un point de vue POO, c'est complètement différent

    Donc, tu n'as aucun besoin de parcourir les membres de ta classe Form. Parcourir les éléments de taForm.Controls doit largement suffire. Parce que s'il est (probablement) possible par réflexion, d'ajouter des champs dynamiquement, c'est un peu too much par rapport à ton besoin, qui n'est que de créer des instances (de contrôles en l'occurrence) et y accéder.

  7. #7
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    tu peut stocker tes textBoxes dans un ArrayList que tu crée
    puis quand tu ajoute un nouveau tu fait array.add(textbox);
    et bien sure tu rempli les propriétes de textbox comme le nom la location ...
    et pour accéder a un element il suffit de chercher par une boucle en faisant du casting
    ((TextBox)array[i]).Text
    avec i est le TextBox désigné
    si tu peut pas le savoir tu ajoute les evènnemens click par exemple pour les textBox
    ...
    sa va converger en principe car j'ai testé sa déja et sa marche bien

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonjour,

    Citation Envoyé par Guulh Voir le message
    Parce que s'il est (probablement) possible par réflexion, d'ajouter des champs dynamiquement, c'est un peu too much par rapport à ton besoin, qui n'est que de créer des instances (de contrôles en l'occurrence) et y accéder.
    Surtout que la réflexion est un concept lent.

    Citation Envoyé par salihovic Voir le message
    tu peut stocker tes textBoxes dans un ArrayList que tu crée
    puis quand tu ajoute un nouveau tu fait array.add(textbox);
    et bien sure tu rempli les propriétes de textbox comme le nom la location ...
    et pour accéder a un element il suffit de chercher par une boucle en faisant du casting
    ((TextBox)array[i]).Text
    avec i est le TextBox désigné
    si tu peut pas le savoir tu ajoute les evènnemens click par exemple pour les textBox
    Il vaut mieux dans ton cas utiliser une collection générique vu que tous les objets auront le même type ça évitera des castings inutiles.

  9. #9
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Il vaut mieux dans ton cas utiliser une collection générique vu que tous les objets auront le même type ça évitera des castings inutiles.
    bon dans mon cas j'ai un controle personalisé de type monthcalendar avec les textBoxes
    donc je dois faire le casting selon le type

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonjour,

    Tu peux regrouper les TextBox dans un panel et parcourir ce panel. Comme le panel ne contient que des TextBox tu n'as pas besoin de caster. Mon avis c'est que tu ne vas caster à chaque fois alors qu'il n'y a qu'un contrôle qui soit un type différent...

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    for each, directcast rien de très long
    et la reflexion n'est pas si lente non plus
    sur les pcs d'aujourd'hui ca reste en dessous de la milliseconde

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    et la reflexion n'est pas si lente non plus
    sur les pcs d'aujourd'hui ca reste en dessous de la milliseconde
    Bah quand même pour certaines utilisations ça peut le devenir...

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'avais fait des tests de performances, dans une boucle de 100x, si je me rappelle bien ça me prenait 15ms
    je sais plus exactement ce que je faisais, mais ça devait un getfield sur un nom de champ précis

  14. #14
    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 sperot51 Voir le message
    j'avais fait des tests de performances, dans une boucle de 100x, si je me rappelle bien ça me prenait 15ms
    je sais plus exactement ce que je faisais, mais ça devait un getfield sur un nom de champ précis
    Dans le cas concret qui nous intéresse dans ce thread, la Réflexion peut largement être évitée. Ce n'est pas parce qu'elle est toute puissante qu'il faut l'utiliser tout le temps ; pour des raisons de perfs notamment, mais aussi parce qu'elle peut engendrer des bugs difficiles à détecter. Si au lieu de faire monTruc.Id, je fais (int)typeof(Machin).GetProperty("Id").GetValue(monTruc) (en gros, j'ai pas de compilo sous la main pour vérifier), ça marche certes ; mais si je refactorise "Id" en "Num", par exemple, ce code va subitement ne plus fonctionner.

    Bref : quand on invente la fusée, on s'en sert pour aller sur la lune, pas pour acheter des clopes au coin de la rue

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    oui ici non seulement on peut l'éviter mais ca complique meme
    c'est pas pour une utilisation de tous les jours

    quand je disais que mon test avait pris 15ms, accéder à la variable ca aurait pris 0ms et pour 100x plus d'itérations !!

Discussions similaires

  1. Interagir sur élément crée dynamiquement
    Par derzy971 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/03/2010, 08h00
  2. [VBA-E 2000]Evènement Enter sur TextBox créé dynamiquement
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/04/2007, 23h00
  3. [C#] Récupérer le texte de textBox créées dynamiquement
    Par cyllix dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/06/2006, 11h45
  4. Réponses: 1
    Dernier message: 25/04/2006, 16h22
  5. Réponses: 5
    Dernier message: 06/03/2006, 17h38

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