1

J'ai fait un ControlDesigner personnalisé que j'ai besoin d'inclure et d'exclure les propriétés affichées dans la grille des propriétés. Mais pour une raison quelconque, il semble juste ignorer le code? Je ne sais pas ce que j'ai pu faire de mal? Pourrais-je manquer quelque chose? Ai-je besoin de configurer VS ou quelque chose?Réflexion et personnalisation ControlDesigner ne semble pas fonctionner dans C#

Dans les exemples, j'ai également trouvé qu'ils semblent être en désaccord sur l'endroit où l'appel de suppression devrait être. Dans certains exemples, ils l'appellent dans la méthode preFilterProperties et dans certains exemples, ils l'appellent dans la méthode postFilterProperties() qui me rend confus. Dans certains exemples, ils l'appellent après l'exécution de la méthode base.preFilterProperties() et parfois avant? Quelqu'un peut-il clarifier?

Voici le code jusqu'à présent. De préférence je voudrais aussi ajouter une propriété avec une liste de noms de propriétés qui seraient exclus mais je ne sais pas quand définir une telle propriété car il semble que la réflexion soit exécutée avant l'exécution? Ou y a-t-il un moyen d'accomplir cela?

using System.ComponentModel; 
using System.Drawing.Design; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
using System.ComponentModel.Design; 
using System; 
using System.Collections; 
using System.Collections.Generic; 

namespace PropertyEditorProject 
{ 
    [Designer(typeof(YourClassDesigner))] 
    class MyPropertyClass 
    { 
     protected List<string> _MyList; 
     protected string _MyName; 
     protected string _MyCarModel; 
     protected int _MyAge; 

     public List<string> MyList 
     { 
      get 
      { 
       return _MyList; 
      } 
      set 
      { 
       _MyList = value; 
      } 
     } 

     public string MyName 
     { 
      get 
      { 
       return _MyName; 
      } 
      set 
      { 
       _MyName = value; 
      } 
     } 

     public string MyCarModel 
     { 
      get 
      { 
       return _MyCarModel; 
      } 
      set 
      { 
       _MyCarModel = value; 
      } 
     } 

     public int MyAge 
     { 
      get 
      { 
       return _MyAge; 
      } 
      set 
      { 
       _MyAge = value; 
      } 
     } 

     public MyPropertyClass() 
     { 
      _MyList = new List<string>(); 
      _MyList.Add("Test"); 
      _MyList.Add("Testing 2"); 

      _MyName = "TestName"; 
      _MyCarModel = "Subaru"; 
      _MyAge = 20; 

     } 
    } 

    internal class YourClassDesigner : ControlDesigner 
    { 
     protected override void PreFilterProperties(System.Collections.IDictionary properties) 
     { 
      properties.Remove("MyAge"); 
      base.PreFilterProperties(properties); 

     } 
    } 

    static class MainProgram 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Form form = new Form(); 
      PropertyGrid grid = new PropertyGrid(); 
      grid.Dock = DockStyle.Fill; 
      form.Controls.Add(grid); 
      grid.SelectedObject = new MyPropertyClass(); 
      Application.Run(form); 
     } 
    } 
} 

Vous avez des idées? Reconnaissants pour toute aide

Répondre

0

Après un peu de recherche, j'ai trouvé la réponse à une de mes questions:

« La règle générale à suivre est d'ajouter ou supprimer des éléments dans les « méthodes Préfiltre » et modifier des éléments existants Dans les méthodes "PostFilter", appelez toujours la méthode de base dans les méthodes PreFilter et appelez la méthode de base en dernier dans les méthodes PostFilter, ce qui garantit que toutes les classes de concepteurs auront la possibilité d'appliquer leurs modifications. "

http://msdn.microsoft.com/en-us/library/ms973820.aspx

Cependant, je ne peux pas comprendre pourquoi le code ne fonctionnera pas si :(