Problème d'accès aux membres privés via Réflection [Résolu]

jet_d_ail 6 Messages postés lundi 21 février 2005Date d'inscription 12 mars 2007 Dernière intervention - 15 févr. 2007 à 09:49 - Dernière réponse : jet_d_ail 6 Messages postés lundi 21 février 2005Date d'inscription 12 mars 2007 Dernière intervention
- 15 févr. 2007 à 10:30
Bonjour je cherche depuis un moment à accéder à un certain champ privé d'un PropertyGrid, mais ca ne marche pas à tous les coups!
Voici mon code :

Type t = propertyGridView.GetType();

IWindowsFormsEditorService service = propertyGridView
as
IWindowsFormsEditorService;

FieldInfo infoLb = t.GetField(
"listBox",
BindingFlags.NonPublic |
BindingFlags.Instance);

object o = infoLb.GetValue(propertyGridView);

ListBox lb = o
as
ListBox;

MethodInfo method = t.GetMethod(
"GetValueWidth");
lb.Width = (
int)method.Invoke(propertyGridView,
null);
method = t.GetMethod(
"DropDownUpdate");
method.Invoke(propertyGridView,
null);s
service.DropDownControl(lb);

Ce que je cherche à faire exactement, c'est d'ouvrir la ComboBox d'un champ du PropertyGrid que j'ai sélectionné au préalable.
Ici je suis dans une class héritée de PropertyGrid. propertyGridView est une variable membre que je récupère au lancement du programme et qui est le PropertyGridView contenu dans le PropertyGrid (membre privé auquel j'ai accès sans problème!).

Lorsque j'exécute le code, infoLb est correctement initialisé, mais lorsque je fais le GetValue, il me retourne null
Par contre, si j'utilise Intellisence pour voir le contenu de propertyGridView et que je vois la variable listBox et que je repasse dans le même code alors la je récupère correctement la variable! Ensuite, si je réexécute la méthode autant de fois que je le souhaite ca fonctionnera à tous les coups!

Si un esprit éclairé veut bien venir éclairer le mien, je lui en serais très reconnaissant
En passant, si vous avez une autre méthode pour ouvrir la Combo je suis partant! Je ne suis pas encore certain que le ListBox soit rempli de cette manière mais ca c'est une autre histoire ;)
Afficher la suite 

1 réponse

Répondre au sujet
jet_d_ail 6 Messages postés lundi 21 février 2005Date d'inscription 12 mars 2007 Dernière intervention - 15 févr. 2007 à 10:30
+3
Utile
Bon benh des fois que ca intéresserait quelqu'un j'ai trouvé une alternative qui fonctionne (merci au CallStack) et qui est un peu moins barbare, mais toujours basée sur le même principe :

Type t = propertyGridView.GetType();

FieldInfo info = t.GetField(
"selectedRow",
BindingFlags.NonPublic |
BindingFlags.Instance);

MethodInfo method = t.GetMethod(
"PopupDialog");
method.Invoke(propertyGridView,
new
object[] { info.GetValue(propertyGridView) });

Je récupère le ligne sélectionnée, et j'apelle la méthode PopupDialog en lui fournissant la ligne en cours et ca fonctionne parfaitement :). En plus, avec cette méthode la liste est remplie correctement :)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jet_d_ail

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.