2009-03-09 8 views
3

ИспользованиеProgramatically Скрыть поле в PropertyGrid

<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _ 

об объявлении класса (который является собственностью другого класса), который состоит из множества свойств.

загружает экземпляр этого класса с просто ...

PropertyGrid1.SelectedObject = oColumn 

Очевидно, что я не хочу, чтобы вручную построить PropertyGrid в коде, я знаю, как сделать это.

Но вот в чем проблема. В зависимости от стоимости имущества, некоторые другие свойства не должны быть видны, как если бы я использовал атрибут

<System.ComponentModel.Browsable(False)> _ 

на имущественной декларации.

Есть в любом случае сделать это программно, без необходимости обрабатывать все здание сетки свойств вручную>

ответ

1

если вы надеялись на gridItem.Hide(), то ответ нет. Единственный способ добиться этого в MS PropertyGrid - динамически публиковать ваши свойства с помощью метода GetProperties для TypeConverter или дескриптора настраиваемого типа (который реализует ICustomTypeDescriptor). Сначала я попытался бы использовать TypeConverter (особенно если значения свойств, которые вы хотите проверить, находятся на одном уровне), есть меньше кодирования.

15

На самом деле это вполне возможно. Первый и самый простой способ установить сетку в BrowsableAttributes свойства:

propGraph.BrowsableAttributes = new AttributeCollection(
    new Attribute[] 
    { 
     new CategoryAttribute("Appearance") 
    }); 

Это будет отфильтровывать все свойства, которые не соответствуют атрибутам типов номерному. К сожалению, это положительный фильтр, а не отрицательный фильтр, который делает его менее полезным ИМХО.

Во-вторых, вы также можете создать простую оболочку вокруг объекта, который вы хотите отобразить в PropertyGrid, и переопределить любые свойства, которые вы хотите скрыть/etc. в качестве сквозных свойств:

public class MyDerivedControl : public TextBox 
{ 
    [Browsable(false)] 
    [Category("MyCustomCategory")] 
    public new bool Enabled 
    { 
     get { return base.Enabled } 
     set { base.Enabled = value; } 
    } 
} 

Попасть в сетку свойств и свойство Enabled будет скрыто.

В-третьих, вы можете настроить PropertyGrid самостоятельно и войти в мир дескрипторов типов и т. Д., Но если все, что вы хотите сделать, это скрыть пару свойств, это перебор.

Надеюсь, это поможет.

+0

отличная подсказка с BrowsableAttributes, если вы не заботитесь о порядке сортировки. – msfanboy

+0

Это именно то решение, которое я искал. Спасибо тоннеру. [Категория ("Дизайн")] Публичная новая внешность Внешний вид { {return base.Appearance; } set {base.Appearance = value; } } –

-2

This Question похоже, но ответы более полные. Некоторые люди, возможно, захотят перекрестные ссылки.

0

Что касается C++, здесь простое решение показать выбранную категорию в propertyGrid.

cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")}; 
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs); 
this->PropertyGrid->SelectedObject = this->SelectedControl; 

Это отобразит только категорию «Внешний вид» в собственностиGrid и спрячет все другие категории. Предполагая, что вы можете перевести код на C# самостоятельно.

Смежные вопросы