Программно скрыть поле в PropertyGrid
-
06-07-2019 - |
Вопрос
С использованием
<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#.
Этот вопрос аналогично, но ответы более полные.Некоторые люди могут захотеть сделать перекрестную ссылку.