Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Стандартные значения для TypeConverter


Автор: Freak_FB 28.8.2007, 14:44
Вот, продолжаю тренироваться на конвертере типов. На этот раз пытаюсь заставить работать список стандартных значений. Есть код:
Код

public class BaudRateConverter : TypeConverter
{
    private ArrayList values;

    public BaudRateConverter()
    {
        values = new ArrayList(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
    }

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        StandardValuesCollection svc = new StandardValuesCollection(values);
        return svc;
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;
        else
            return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (values.GetType() == typeof(string))
        {
            int newVal = int.Parse((string)value);
            if (values.Contains(newVal))
                return newVal;
            else
                return base.ConvertFrom(context, culture, value);
        }
        return base.ConvertFrom(context, culture, value);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string))
            return true;
        else
            return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
            return string.Format("{0}", value);
        else
            return base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool IsValid(ITypeDescriptorContext context, object value)
    {
        return true;
    }
}

Хочу, значит, чтобы свойство, которому приписан данный конвертер типов, раскрывалось как список определённых значений от 1 до 9.
Скомпилил, поцепил компонент на форму. Нажимаю на стрелку "вниз", дабы посмотреть список возможных вариантов.Получаю пустой список (хотя высотой, вроде, на мои 9 элементов): картинка в аттаче.
При этом, клацая в этом пустом поле, якобы если бы там были значения, выскакивает окошко с ошибкой следующего содержания: Property value is not valid. BaudRateConverter cannot convert from System.String.
Кто занимался подобным, подскажите, где грабли.

Автор: Freak_FB 30.8.2007, 10:47
Проблема решена.
Оказалось, что в коде функции ConvertFrom допущена ошибка - вместо value.GetType() использовано values.GetType(), что, конечно, не ошибочно во время компиляции, но принесло много головной боли во время отладки готового компонента.

Автор: IEZ 31.8.2007, 22:33
Код

public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            // false - можно вводить вручную
            // true - только выбор из списка
            return true;
        }

Если вставить это то в строке свойства юзвер не сможет писать буковки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)