Как изменить поведение сетки объектов в среде выполнения? - PullRequest
0 голосов
/ 16 сентября 2011
  1. Есть ли способ изменить поведение элемента сетки сетки свойств во время выполнения? Что мне нужно, так это то, что у меня есть одно свойство с именем «Образование». Если пользователь выберет «Мастера», то следующий элемент сетки покажет образование, связанное с мастером, в раскрывающемся меню. Если пользователь выбирает «Другие» в «Образовании», то следующим элементом управления будет текстовое поле для ввода данных пользователем. Я знаю, как показать выпадающий элемент управления, только мне нужно, как я могу переключить эти два элемента управления на основе выбора пользователя.

  2. Еще один вопрос, есть ли способ установить для свойства griditem "Browsable" значение false / true во время выполнения?

Возможно ли это?

1 Ответ

1 голос
/ 18 сентября 2011

Поскольку ваш код после примера должен начать вас с чего-то вроде следующего:

//Represents each property to show in the control, required since 
//PropertyDescriptor is declared abstract
public class MyPropertyDescriptor : PropertyDescriptor
{
  public MyPropertyDescriptor(string name, Attribute[] attrs) : base(name, attrs)
  {
  }
}

//This is the class that is bound to the PropertyGrid. Using 
//CustomTypeDescriptor instead of ICustomTypeDescriptor saves you from 
//having to implement all the methods in the interface which are stubbed out
//or default to the implementation in TypeDescriptor
public class MyClass : CustomTypeDescriptor
{
   //This is the property that controls what other properties will be 
   //shown in the PropertyGrid,  by attaching the RefreshProperties 
   //attribute, this will tell  the PropertyGrid to query the bound 
   //object for the list of properties to show by calling your implementation
   //of GetProperties 
   [RefreshProperties(RefreshProperties.All)]
   public int ControllingProperty { get; set; }

   //Dependent properties that can be dynamically added/removed
   public int SomeProp { get; set; }
   public int SomeOtherProp { get; set; }

   //Return the list of properties to show 
   public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
   {
      List<MyPropertyDescriptor> props = new List<MyPropertyDescriptor>();

      //Insert logic here to determine what properties need adding to props
      //based on the current property values

      return PropertyDescriptorCollection(props.ToArray());
   }
}

Теперь, когда вы привязываете экземпляр MyClass к PropertyGrid, ваша реализация GetProperties будетчто дает вам возможность определить, какие свойства вы хотите показать, заполнив соответствующую коллекцию свойств.

...