Устанавливать дублированные столбцы при добавлении провайдера TypeDescriptor

Я пытаюсь добавить провайдера TypeDescriptor для класса, который я использую как источник данных в моем datagridview, с этим кодом:

private void FrmTarifadoVariantes_Load(object sender, EventArgs e)
    {
        System.ComponentModel.TypeDescriptor.AddProvider((new MyTypeDescriptionProvider<TarifadoVarianteBE>()), typeof(TarifadoBloquesBE));
        System.ComponentModel.TypeDescriptor.AddProvider((new MyTypeDescriptionProvider<BloquePrendaBE>()), typeof(TarifadoBloquesBE));
    }

ВОПРОС 1:

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

Существует MyTypeDescriptionProvider, который я нашел при поиске в сети:

public class MyTypeDescriptionProvider<T> : TypeDescriptionProvider
{
    private ICustomTypeDescriptor td;
    public MyTypeDescriptionProvider()
        : this(TypeDescriptor.GetProvider(typeof(TarifadoBloquesBE)))
    {
    }
    public MyTypeDescriptionProvider(TypeDescriptionProvider parent)
        : base(parent)
    {
    }
    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        if (td == null)
        {
            td = base.GetTypeDescriptor(objectType, instance);
            td = new MyCustomTypeDescriptor(td, typeof(T));
        }
        return td;
    }
}

public class SubPropertyDescriptor : PropertyDescriptor
{
    private PropertyDescriptor _subPD;
    private PropertyDescriptor _parentPD;

    public SubPropertyDescriptor(PropertyDescriptor parentPD, PropertyDescriptor subPD, string pdname)
        : base(pdname, null)
    {
        _subPD = subPD;
        _parentPD = parentPD;
    }

    public override bool IsReadOnly { get { return false; } }
    public override void ResetValue(object component) { }
    public override bool CanResetValue(object component) { return false; }
    public override bool ShouldSerializeValue(object component)
    {
        return true;
    }

    public override Type ComponentType
    {
        get { return _parentPD.ComponentType; }
    }
    public override Type PropertyType { get { return _subPD.PropertyType; } }

    public override object GetValue(object component)
    {
        return _subPD.GetValue(_parentPD.GetValue(component));
    }

    public override void SetValue(object component, object value)
    {
        _subPD.SetValue(_parentPD.GetValue(component), value);
        OnValueChanged(component, EventArgs.Empty);
    }
}

public class MyCustomTypeDescriptor : CustomTypeDescriptor
{
    Type typeProperty;
    public MyCustomTypeDescriptor(ICustomTypeDescriptor parent, Type type)
        : base(parent)
    {
        typeProperty = type;
    }
    public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        PropertyDescriptorCollection cols = base.GetProperties(attributes);


        string propertyName = "";
        foreach (PropertyDescriptor col in cols)
        {
            //se agregó si el attributo es browsable
            if (col.IsBrowsable)
            {
                if (col.PropertyType.Name == typeProperty.Name)
                {
                    propertyName = col.Name;
                    break;
                }

            }
        }
        PropertyDescriptor pd = cols[propertyName];
        PropertyDescriptorCollection children = pd.GetChildProperties();
        PropertyDescriptor[] array = new PropertyDescriptor[cols.Count + children.Count];
        int count = cols.Count;
        cols.CopyTo(array, 0);

        foreach (PropertyDescriptor cpd in children)
        {
            if (cpd.IsBrowsable)
            {
                array[count] = new SubPropertyDescriptor(pd, cpd, pd.Name + "_" + cpd.Name);
                count++;
            }
        }

        //PropertyDescriptor[] arrayTmp = new PropertyDescriptor[count];

        Array.Resize(ref array, count);

        PropertyDescriptorCollection newcols = new PropertyDescriptorCollection(array);
        return newcols;
    }
}

ВОПРОС 2:

Как я могу сделать MyTypeDescriptionProvider динамическим, я имею в виду, если вы можете проверить, я жестко кодирую класс (TarifadoBloquesBE) GetProvider, в этой части:

private ICustomTypeDescriptor td;
    public MyTypeDescriptionProvider()
        : this(TypeDescriptor.GetProvider(typeof(TarifadoBloquesBE)))
    {
    }

Я хочу разрешить отправку, какой класс будет провайдером. Спасибо.

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

Все хорошо здесь

Все хорошо

Дублирующиеся столбцы

Дублирующиеся столбцы

0 ответов

Другие вопросы по тегам