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

Résolu
jet_d_ail Messages postés 6 Date d'inscription lundi 21 février 2005 Statut Membre Dernière intervention 12 mars 2007 - 15 févr. 2007 à 09:49
jet_d_ail Messages postés 6 Date d'inscription lundi 21 février 2005 Statut Membre Dernière intervention 12 mars 2007 - 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 ;)

1 réponse

jet_d_ail Messages postés 6 Date d'inscription lundi 21 février 2005 Statut Membre Dernière intervention 12 mars 2007
15 févr. 2007 à 10:30
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 :)
3
Rejoignez-nous