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; }


Введите описание изображения здесь



Введите описание изображения здесь
Здесь я не знаю, как передать мое условие, чтобы вышеупомянутые столбцы исчезли во время выполнения.

741   1  

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

    Ничего не найдено.