[c#] reflexivité et control

reflexivité et control [c#] - C#/.NET managed - Programmation

Marsh Posté le 09-03-2005 à 18:33:48    

Bonjour,
 
je débute en c# et je viens de rencontrer un problème:
 
 
Pour me faire la main, je développe une petite ihm avec des règles de liants des champs entre eux (si la case est cochée, telle rubique est visible etc... ).
Pour essayer de rendre le système un peu générique, j'ai crée un "manager" qui gère ces règles. Toutes les rubriques s'authentifient au manager et j'ajoute diffèrents handlers pour que le manager sache qu'il y a eu un changement dans une rubrique.

Code :
  1. public Form1()
  2. {
  3.    //
  4.    // Requis pour la prise en charge du Concepteur Windows Forms
  5.    //
  6. InitializeComponent();
  7. // j'ai surdéfini TabControl pour qu'il contienne mon controleur.  
  8. //Je reference ici les controles
  9.   this.tabControl1.Add(this.textBox2);
  10.   this.tabControl1.Add(this.label2);
  11.   this.tabControl1.Add(this.textBox1);
  12.   this.tabControl1.Add(this.label3);
  13.   this.tabControl1.Add(this.label4);
  14.   this.tabControl1.Add(this.textBox3);
  15.   this.tabControl1.Add(this.groupBox1);


 
le controleur :

Code :
  1. public myController()
  2. {
  3.    rules = new Rules();
  4. // une règle liant des controls : si le control "textBox1" contient  
  5. // le texte "enable" le control "groupBox1" passe l'attribut "Enable"  
  6. // a true  
  7.    rules.AddRule( "textBox1","enable","groupBox1",true,"Enabled" );
  8. }
  9. // la méthode d'ajout et de bind des evenements
  10. public void Add(System.Windows.Forms.Control ctrl)
  11. {
  12. this.myConpoment.Add(ctrl);
  13. ctrl.Click += new System.EventHandler(this.yela);
  14. ctrl.Leave += new System.EventHandler(this.yela);
  15. }
  16. //la méthode qui gère les règles
  17. private void yela(object sender, System.EventArgs e)
  18. {
  19.   // on reccupere le controle emetteur du signal
  20.   System.Windows.Forms.Control ctrl = (System.Windows.Forms.Control)sender ;
  21.   // on reccupere la règle associée  
  22.   myApp.config.Rules.Rule rule = this.rules.getRule(ctrl.Name+"_"+ctrl.Text );
  23. // si cette regle existe
  24.   if ( rule != null)
  25.   {
  26.   // si le  controle est le bon (inutile)
  27.   if ( rule.rubName.Equals(ctrl.Name) )
  28.   {
  29.    Type type = (this.GetControlByName(rule.destinationName)).GetType();
  30.    // si la veleur du controle est la bonne
  31.    if ( rule.rubValue.Equals(ctrl.Text) )
  32.    {
  33.     // j'invoque la méthode voulue.
  34.      type.InvokeMember(rule.destiantionField,
  35. BindingFlags.DeclaredOnly |
  36. BindingFlags.Public | BindingFlags.NonPublic |
  37. BindingFlags.Instance | BindingFlags.SetField, null,
  38. this.GetControlByName(rule.destinationName), new Object[] {true});
  39.     }
  40.   }
  41. }
  42. }


 
 
Mon problème : l'attribut Enable de control n'est pas accessible. Je leve une exception :

Code :
  1. ************** Texte de l'exception **************
  2. System.MissingFieldException: Champ myApp.MMI.MyGroupBox.Enabled introuvable.
  3.    at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
  4.    at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args)
  5.    at myApp.Controller.myController.yela(Object sender, EventArgs e) in c:\documents and settings\frederic.pernias\mes documents\visual studio projects\windowsapplication2\windowsapplication2\controller\mycontroler.cs:line 84
  6.    at System.Windows.Forms.Control.OnLeave(EventArgs e)
  7.    at System.Windows.Forms.Control.NotifyLeave()
  8.    at System.Windows.Forms.ContainerControl.UpdateFocusedControl()


 
Le text est clair, cet attribut n'existe pas. pour tant un " myControl.Enabled = true ;" fonctionne.
J'ai un peu cherché, et j'ai l'impression que cet "Enabled" est un peu une sorte d'alias vers une méthode/attribut de la classe.
Quelqu'un pourrait il eclairer ma lanterne ?
 
Merci
 
Fred

Reply

Marsh Posté le 09-03-2005 à 18:33:48   

Reply

Marsh Posté le 09-03-2005 à 18:50:25    

C'est quoi le type de MyGroupBox ?

Reply

Marsh Posté le 09-03-2005 à 18:53:44    

MyGroupBox herite de groupBox et ne fait rien de plus


Message édité par fred_p le 09-03-2005 à 18:54:06
Reply

Marsh Posté le 09-03-2005 à 19:01:20    

Ok, j'ai vite regardé dans la MSDN. Et Enabled est une propriété. Hors, dans les BindingFlags, t'as mis SetField. Remplace-le par SetProperty :)

Reply

Marsh Posté le 10-03-2005 à 08:57:11    

Voila, cela fonctionne maintenant. Le Setproperty est nécessaire (merci FlorentG), mais le problème ne venait pas que de là. La propriété Enabled n'est pas "déclarée" explicitement semble t il puisqu'en enlevant "BindingFlags.DeclaredOnly" cela fonctionne (...Only look at the members declared on the Type...). Quelqu'un peut il m'expliquer ce principe de propriété "non déclarée"?

Reply

Marsh Posté le 10-03-2005 à 10:40:11    

bon, en fait je ne sais pas lire je crois ... le declaredOnly specifie qu'on ne cherhce que dans la classe et pas dans celle dont elle herite. Comme Enabled vient de Control, je ne pouvais pas la trouver.  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed