Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1700 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [c#] reflexivité et control

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c#] reflexivité et control

n°1007141
fred_p
Posté le 09-03-2005 à 18:33:48  profilanswer
 

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

mood
Publicité
Posté le 09-03-2005 à 18:33:48  profilanswer
 

n°1007153
FlorentG
Posté le 09-03-2005 à 18:50:25  profilanswer
 

C'est quoi le type de MyGroupBox ?

n°1007161
fred_p
Posté le 09-03-2005 à 18:53:44  profilanswer
 

MyGroupBox herite de groupBox et ne fait rien de plus


Message édité par fred_p le 09-03-2005 à 18:54:06
n°1007167
FlorentG
Posté le 09-03-2005 à 19:01:20  profilanswer
 

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 :)

n°1007685
fred_p
Posté le 10-03-2005 à 08:57:11  profilanswer
 

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"?

n°1007807
fred_p
Posté le 10-03-2005 à 10:40:11  profilanswer
 

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.  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [c#] reflexivité et control

 

Sujets relatifs
Reflexivité sous QTUtilisation de control progress
Win32, listview control : Changer la font d'une seule colonne ?[PHP & Flash] Formulaire en Flash > Pb de Control données ! :'(
[Résolu][ASPX][C#] Création dynamique d'un control et évènementControl-cache rigoureu
[JMF] Pb affichage ds le control PanelTp de Java : Réflexivité... je suis perdu
[Légal] Ink control dans le cadre d'une signatureMasquer un control actif
Plus de sujets relatifs à : [c#] reflexivité et control


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR