Вопрос

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

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

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

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

PropertyGrid1.SelectedObject = oColumn

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

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

<System.ComponentModel.Browsable(False)> _

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

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

Это было полезно?

Решение

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

Другие советы

На самом деле это вполне возможно.Первый и самый простой способ — установить свойство 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; }
    }
}

Вставьте это в сетку свойств, и свойство «Включено» будет скрыто.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top