C# Winform CollectionPropertiesEditor-как скрыть некоторые свойства во встроенной PropertyGrid на основе условия выполнения
Есть ли способ, чтобы скрыть показать свойства "сетки CollectionPropertiesEditor по "
Недавно я обнаружил, что есть способ изменить атрибут PropertyGrid, который можно просматривать во время выполнения.
Я хочу знать, можно ли это сделать с "Collectionpropertieseditor's PropertyGrid", мне не удалось найти соответствующие результаты в поиске Google. Теперь я надеюсь, что StackOverflow поможет мне решить эту проблему.
Проблема: мне пришлось добавить некоторые свойства в GridColumn контроль в связи с новыми требованиями заказчика.
[Category("Extra")]
[Browsable(true)]
public int? Position { get; set; }
[Category("Extra")]
[Browsable(true)]
public string storedColumn { get; set; }
То, что я надеялся сделать раньше:
[Category("Extra")]
[Browsable(matchSomeRunTimeCondition)]
public int? Position { get; set; }
[Category("Extra")]
[Browsable(matchSomeRunTimeCondition)]
public string storedColumn { get; set; }
Почему это не работает?
Потому что просматриваемый атрибут может принимать только константу. И matchSomeRunTimeCondition не является константой. Пользователь может изменить его, когда-либо он хочет, пока приложение все еще работает.
В коде, если есть функция, которую я могу использовать, чтобы сделать их невидимыми во время выполнения, я буду очень благодарен, если кто-то может помочь мне написать одну такую функцию или условный оператор следующим образом:
If (категория свойства = = "Extra") {
//Не показывайте это свойство в propertygrid.
/ / или другими словами, сделайте атрибут Browasable ложным во время выполнения.
}
Во время компиляции я устанавливаю свойство Browsable в true, потому что оно должно быть видно в некоторых условиях. Но мне нужен механизм, чтобы скрыть это, основанный на выборе пользователя во время выполнения.
Эта проблема была преодолена в propertygrid посредством установки его во время загрузки выбранного элемента управления, как описано в посте: сделать все свойства с определенным именем категории невидимыми в PropertyGrid в C# Winforms во время выполнения на основе некоторого условия
Однако в CollectionPropertiesEditor, который я использую для хранения моих столбцов сетки, нет этой роскоши (по крайней мере, я не мог узнать, как это сделать).
Я храню все столбцы сетки моей сетки в виде списка GridColumns как a собственность.
Вот как я сейчас храню GridColumns в свойствах сетки:
[Browsable(true)]
[Editor(typeof(CollectionPropertiesEditor), typeof(UITypeEditor))]
public List<TGridColumn> Columns { get; set; }

Здесь я не знаю, как передать мое условие, чтобы вышеупомянутые столбцы исчезли во время выполнения.
1 ответ:
Вы должны написать свой собственный дескриптор типа, производя от
CustomTypeDescriptorили реализуяICustomTypeDescriptor. Вот пример:MyPropertyDescriptor
Укажите пользовательское описание свойства. Здесь я переопределяю свойство
Attributes, чтобы предоставить новый список атрибутов для свойства. Например, я проверяю, имеет ли свойство[Category("Extra")], я также добавил[Browsable(false)]в его коллекцию атрибутов.using System; using System.ComponentModel; using System.Linq; public class MyPropertyDescriptor : PropertyDescriptor { PropertyDescriptor o; public MyPropertyDescriptor(PropertyDescriptor originalProperty) : base(originalProperty) { o = originalProperty; } public override bool CanResetValue(object component) { return o.CanResetValue(component); } public override object GetValue(object component) { return o.GetValue(component); } public override void ResetValue(object component) { o.ResetValue(component); } public override void SetValue(object component, object value) { o.SetValue(component, value); } public override bool ShouldSerializeValue(object component) { return o.ShouldSerializeValue(component); } public override AttributeCollection Attributes { get { var attributes = base.Attributes.Cast<Attribute>().ToList(); var category = attributes.OfType<CategoryAttribute>().FirstOrDefault(); if (category != null && category.Category == "Extra") attributes.Add(new BrowsableAttribute(false)); return new AttributeCollection(attributes.ToArray()); } } public override Type ComponentType { get { return o.ComponentType; } } public override bool IsReadOnly { get { return o.IsReadOnly; } } public override Type PropertyType { get { return o.PropertyType; } } }MyTypeDescriptor
Используется для предоставления списка пользовательских дескрипторы свойств для типа.
using System; using System.ComponentModel; using System.Linq; public class MyTypeDescriptor : CustomTypeDescriptor { ICustomTypeDescriptor original; public MyTypeDescriptor(ICustomTypeDescriptor originalDescriptor) : base(originalDescriptor) { original = originalDescriptor; } public override PropertyDescriptorCollection GetProperties() { return this.GetProperties(new Attribute[] { }); } public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) { var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>() .Select(p => new MyPropertyDescriptor(p)) .ToArray(); return new PropertyDescriptorCollection(properties); } }MyTypeDescriptionProvider
Используется для подключения
MyTypeDescriptorк классу с помощью атрибутаTypeDescriptionProvider.using System; using System.ComponentModel; public class MyTypeDescriptionProvider : TypeDescriptionProvider { public MyTypeDescriptionProvider() : base(TypeDescriptor.GetProvider(typeof(object))) { } public override ICustomTypeDescriptor GetTypeDescriptor(Type type, object o) { ICustomTypeDescriptor baseDescriptor = base.GetTypeDescriptor(type, o); return new MyTypeDescriptor(baseDescriptor); } }MySampleClass
Содержит свойство, украшенное
[Category("Extra")]. Так чтоProperty2не будет виден в сетке свойств. (В visual studio или редакторе коллекций или даже в сетке свойств времени выполнения)[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))] public class MySampleClass { public int Property1 { get; set; } [Category("Extra")] public string Property2 { get; set; } }Микомплекскомпонент
Содержит коллекцию
MySampleClass. Так что вы можете видеть поведениеMySampleClassв Редакторе коллекции.using System.Collections.ObjectModel; using System.ComponentModel; public class MyComplexComponent:Component { public MyComplexComponent() { MySampleClasses = new Collection<MySampleClass>(); } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public Collection<MySampleClass> MySampleClasses { get; set; } }Скриншот


Comments