Программно скрыть поле в PropertyGrid - PullRequest
3 голосов
/ 09 марта 2009

Использование

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

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

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

PropertyGrid1.SelectedObject = oColumn

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

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

<System.ComponentModel.Browsable(False)> _

атрибут в объявлении свойства.

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

Ответы [ 4 ]

15 голосов
/ 31 июля 2009

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

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

Это отфильтрует все свойства, которые НЕ соответствуют типам атрибутов, которые вы предоставляете. К сожалению, это положительный фильтр, а не отрицательный, что делает его менее полезным IMHO.

Во-вторых, одинаково легко, вы можете создать простую обертку вокруг объекта, который вы хотите отобразить в 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 и попасть в мир дескрипторов типов и т. Д., Но если все, что вам нужно, это скрыть пару свойств, это излишне.

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

1 голос
/ 10 марта 2009

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

0 голосов
/ 17 апреля 2013

Что касается C ++, вот простое решение для отображения выбранной категории в propertyGrid.

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

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

0 голосов
/ 16 июля 2010

Этот вопрос похож, но ответы более полны. Некоторые люди могут захотеть сделать перекрестную ссылку.

...