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#] Comment utiliser reflection sur un bouton privé ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [C#] Comment utiliser reflection sur un bouton privé ?
    Bonjour à tous,
    je cale depuis une semaine sur un truc bête comme chou.

    Je veux accéder à un bouton depuis son nom contenu dans une String.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Type t;
    FieldInfo fi;
    t = this.GetType();
    fi = t.GetField("button1");
    Debug.WriteLine(this.Contains(button1));
    Debug.WriteLine(fi);
    Le problème c'est que ça ne marche désespéremment pas...
    La méthode GetField() me renvoit toujours null peut importe ce que je mets entre parenthèses. Alors que la ligne suivante me confirme bien que mon boutton est sur ma form... Et cette partie de code est lancée lors du click sur mon boutton via un événement.

    Dites-moi là où je me suis planté car je ne comprends pas mon erreur.
    Merci.

  2. #2
    Membre Expert
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Par défaut
    Peut tu indiquer l'utilité de récupérer la référence du boutton par réflexion alors que tu en connais le nom, et que dans l'événement tu as la référence avec la variable sender ?


    Edit :
    Sinon si ton champ est privé regarde là :
    Specify BindingFlags.NonPublic to include non-public fields (that is, private and protected fields) in the search.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemtypeclassgetfieldtopic2.asp

  3. #3
    Invité
    Invité(e)
    Par défaut
    Là ce n'est qu'un bête exemple.
    Mais ça aura pour but de ne donner l'accès qu'à certains forms, butons, labels, combo boxes, text boxes, etcetera..
    Je récupère depuis une base de données tous les composants auquel un certain user peut avoir accès, plus ce qu'il peut en faire avec : read, new, modify ou delete.

  4. #4
    Membre Expert
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Par défaut
    La reflexion me parait lourd ne peut tu pas a chaque load d'une form cacher les éléments auxquels l'utilisateur n'a pas accés ?
    Ou verifier lors de ton action, à l'aide du sender que l'action est authorisée ?
    Honnêtement je pense qu'il existe pas mal de façon de ne pas utiliser la reflexion qui risque de ralentir tes traitements si tu l'utilise abusivement.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bah je ne connais pas trop tous les outils .NET permettant de faire l'équivalent de la reflection...

    Moi on m'a dit d'utiliser ça... après j'essaye d'implémenter.

    Maintenant si t'as une autre solution je suis preneur

    Tout ce que je sais, c'est que j'ai chaque contrôle qui sera encodé dans la base de données. Chaque groupe ou user sera relié aux contrôles auxquels il aura accès.
    Hormis la relfection, je n'ai pas vu d'autres alternatives.

  6. #6
    Membre Expert
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Par défaut
    Je comprend. Je t'expose juste ma vision des choses. Après tu en fait ce que tu veux. Si tu dois explicitement utiliser la reflexion, soit.

    Mon lien sur le problème donnée privée / publique t'as t-il aidé ? Ou le problème est-il ailleurs ?

    Pour les solutions annexe, cela dépend de ce que tu dois faire.
    Quand quelqu'un clique sur un bouton et que tu récupére l'événement tu as en entrée de la méthode le sender qui est le contrôle qui a reçu l'événement. Dans ca cas tu as directement la référence et le nom du contrôle, ici le bouton.
    Maintenant pour les autres contrôle ça peut être différent. Mais je pense que pour chacun tu peux trouver une solution alternative plus "légére" que la reflexion.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je ne pense pas que je doive absolument implémenter la reflection.
    Si je présente une alternative qui prend moins de ressources, ils seront contents.

    J'ai déjà implémenter les AppDomain et les plugins pour gagner en performances. Donc si j'en remets une couche ça sera pas plus mal.

    Mais ici, ce n'était qu'un test. Ca ne sera pas toujours un click de bouton qui déclenchera l'apparition ou non de la fenêtre.
    Le premier écran est un log on tout ce qu'il y a de plus classique, j'en profite pour récupérer les droits de l'utilisateur via son groupe et éventuellement des fonctionnalités individuelles. Par là, j'entends la liste de tous les composants qu'il peut voir et ce qu'il peut en faire.
    Donc à chauqe load de form, je dois faire table rase et seulement afficher ce qu'il peut voir. Plus fixer les propriétés de chaque composant en fonction de son type (on ne peut pas effacer une form, mais sur un datagridview on peut effacer une ligne).


    Sinon j'ai testé ta nouvelle méthode avec BindingFlags et j'espérais vraiment que ça aurait marché. Mais non...
    Moi je pensais que les contrôles étaient public, pas de bol ils sont private.
    Donc logiquement ton astuce aurait dû marché... Je ne vois pas où est l'erreur maintenant...

  8. #8
    Membre Expert
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Par défaut
    Lors du LoadForm, que dois tu faire pour les composants non authorisés ?
    Les vider ?
    Les cacher ?
    Les verouillés ?

    Dans tout les cas lors du load tu peux parcourir la collection de contrôle de la Form et pour chacun verifier les droits et faire ce qu'il faut :
    Vider, verouiller ou cacher, ou verouiller et vider, etc.

    Comme ca tu fait ton contrôle d'accés lors du chargement.

    Enfin tu peux avoir des contrôle sur lesquels ils ont un droit de vue mais pas de modification, là tu dois de toute façon gérer les événements donc aucun problème, tu as le sender.

    Dans tout les cas que je cite, pas besoin de la reflexion. Maintenant si tu as des cas particulier non couvert tu peux les indiquer et on pourra discuter d'une solution.

    Pour le problème d'accés aux fields, je n'ai pas trop d'idée là.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Même GetFields(BindingFlags.NonPublic) ne remplit pas un tableau de FieldInfo...

    Je me demande vraiment où est le problème.

  10. #10
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par L`artiste
    Même GetFields(BindingFlags.NonPublic) ne remplit pas un tableau de FieldInfo...

    Je me demande vraiment où est le problème.
    C'est tout a fait normal, il faut que tu comprenne que les BindingFlags contrôlent les accès. Ils sont principalement de deux types à indiquer necessairement, je simplifie :
    • 1. Membre d'instance ou membre static
      2. Membre Public ou pas
    ...

    Donc par exemple dans ton cas je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Type t = this.GetType();
    FieldInfo[] fIs;
    fIs = t.GetFields(BindingFlags.Instance| BindingFlags.NonPublic);
    je viens de faire l'essai c'est bon, je fais bien apparaître tous mes contrôles dans un ListBox.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup neguib et lakitrid.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2007, 14h07
  2. comment utiliser une icone comme bouton
    Par othmane126 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/10/2006, 19h14
  3. [VS2005][NUnit] Comment utiliser Nunit sur un site web
    Par Dadou74 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 31/08/2006, 09h53
  4. Réponses: 2
    Dernier message: 07/07/2006, 09h57
  5. Réponses: 7
    Dernier message: 18/04/2006, 17h44

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