И снова PropertyGrid и TypeConverter
От: karapuz79 Россия  
Дата: 07.07.04 09:37
Оценка:
Тут эта тема поднималась несколько раз, но солюшена для моего случая я не нашёл.
Простейший случай: int <-> string, со списком стандартных значений.
Всё работает, список работает, конвертится. НО есть ОДНА проблема: при _двойном клике_ на поле, должно выбираться следующее значение из списка, но у меня вылетает ошибка грида: Invalid property value->Cannot widen from target type to primitive type.
Если _MyField организовать как string, то двойной клик работает правильно, но желательно int, и не вводить дополнительных свойств.
Вторые сутки... гугл, мсдн, рсдн...


public class MyClass
{
private int _MyField;

[TypeConverter(typeof(MyFieldConverter))]
public int MyField
{
get
{
return _MyField;
}
set
{
_MyField = value;
}
}
}

public class MyFieldConverter: TypeConverter
{
private ArrayList _values = null;

public MyFieldConverter()
{
_values = new ArrayList(new string[] { "Value 1", "Value 2", "Value 3" });
}

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

public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(_values);
}

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

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

public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if(value is string)
return _values.IndexOf((string)value);
return base.ConvertFrom(context, culture, value);
}

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

public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if(destinationType == typeof(System.String) && value is int)
return _values[(int)value].ToString();
return base.ConvertTo(context, culture, value, destinationType);
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.