1

Я создал пользовательский ControlDesigner, который должен включать и исключать свойства, указанные в сетке свойств. Но почему-то это просто игнорирует код? Я не знаю, что я мог сделать неправильно? Могу ли я что-то упустить? Нужно ли мне настраивать VS или что-то еще?Отражение и пользовательские ControlDesigner, похоже, не работают в C#

Также в примерах, которые я нашел, они, похоже, не согласны с тем, где должен быть вызов на удаление. В некоторых примерах они называют это методом preFilterProperties, и в некоторых примерах они называют это методом postFilterProperties(), который меня смущает. В некоторых примерах они называют это после запуска метода base.preFilterProperties(), а иногда и раньше? Может кто-то прояснить?

Код указан в настоящий момент. Предпочтительно, я хотел бы также добавить свойство со списком имен свойств, которые будут исключены, но я не знаю, когда устанавливать такое свойство, поскольку кажется, что отражение выполняется до выполнения? Или есть способ сделать это?

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); 
     } 
    } 
} 

У кого-нибудь есть идеи? Благодарен за любую помощь

ответ

0

После недолгих поисков я нашел ответ на один из моих вопросов:

«Общее правило следовать, чтобы добавить или удалить элементы в„“методах ПРЕДФИЛЬТРА, и изменить существующие элементы в методах «PostFilter». Всегда вызывайте базовый метод сначала в методах PreFilter и вызывайте базовый метод последним в методах PostFilter. Это гарантирует, что всем конструкторским классам предоставляется надлежащая возможность применить их изменения ».

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

Тем не менее я не могу понять, почему этот код не будет работать, хотя :(