Программно скрыть поле в PropertyGrid

С использованием

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

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

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

PropertyGrid1.SelectedObject = oColumn

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

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

<System.ComponentModel.Browsable(False)> _

атрибут в декларации свойства.

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


person hmcclungiii    schedule 09.03.2009    source источник


Ответы (4)


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

person Nicolas Cadilhac    schedule 10.03.2009

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

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

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

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

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

Поместите это в сетку свойств, и свойство Enabled будет скрыто.

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

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

person Community    schedule 31.07.2009
comment
отличный совет с BrowsableAttributes, если вам не важен порядок сортировки. - person msfanboy; 27.01.2011
comment
это именно то решение, которое я искал. Большое спасибо, братан. Чтобы скрыть внешний вид, вам необходимо сделать: [Просмотр (false)] [Категория (Дизайн)] общедоступный новый Внешний вид Внешний вид {get {return base.Appearance; } установить {base.Appearance = значение; }} - person Ganesh Kamath - 'Code Frenzy'; 07.10.2016

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

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

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

person Hemendra Sharma    schedule 17.04.2013

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

person Charley Rathkopf    schedule 15.07.2010