fred_p | 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 :
- public Form1()
- {
- //
- // Requis pour la prise en charge du Concepteur Windows Forms
- //
- InitializeComponent();
- // j'ai surdéfini TabControl pour qu'il contienne mon controleur.
- //Je reference ici les controles
- this.tabControl1.Add(this.textBox2);
- this.tabControl1.Add(this.label2);
- this.tabControl1.Add(this.textBox1);
- this.tabControl1.Add(this.label3);
- this.tabControl1.Add(this.label4);
- this.tabControl1.Add(this.textBox3);
- this.tabControl1.Add(this.groupBox1);
|
le controleur :
Code :
- public myController()
- {
- rules = new Rules();
- // une règle liant des controls : si le control "textBox1" contient
- // le texte "enable" le control "groupBox1" passe l'attribut "Enable"
- // a true
- rules.AddRule( "textBox1","enable","groupBox1",true,"Enabled" );
- }
- // la méthode d'ajout et de bind des evenements
- public void Add(System.Windows.Forms.Control ctrl)
- {
- this.myConpoment.Add(ctrl);
- ctrl.Click += new System.EventHandler(this.yela);
- ctrl.Leave += new System.EventHandler(this.yela);
- }
- //la méthode qui gère les règles
- private void yela(object sender, System.EventArgs e)
- {
- // on reccupere le controle emetteur du signal
- System.Windows.Forms.Control ctrl = (System.Windows.Forms.Control)sender ;
- // on reccupere la règle associée
- myApp.config.Rules.Rule rule = this.rules.getRule(ctrl.Name+"_"+ctrl.Text );
- // si cette regle existe
- if ( rule != null)
- {
- // si le controle est le bon (inutile)
- if ( rule.rubName.Equals(ctrl.Name) )
- {
- Type type = (this.GetControlByName(rule.destinationName)).GetType();
- // si la veleur du controle est la bonne
- if ( rule.rubValue.Equals(ctrl.Text) )
- {
- // j'invoque la méthode voulue.
- type.InvokeMember(rule.destiantionField,
- BindingFlags.DeclaredOnly |
- BindingFlags.Public | BindingFlags.NonPublic |
- BindingFlags.Instance | BindingFlags.SetField, null,
- this.GetControlByName(rule.destinationName), new Object[] {true});
- }
- }
- }
- }
|
Mon problème : l'attribut Enable de control n'est pas accessible. Je leve une exception :
Code :
- ************** Texte de l'exception **************
- System.MissingFieldException: Champ myApp.MMI.MyGroupBox.Enabled introuvable.
- at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
- at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args)
- 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
- at System.Windows.Forms.Control.OnLeave(EventArgs e)
- at System.Windows.Forms.Control.NotifyLeave()
- 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 |