2008/07/08(Tue) 21:38:49 編集(投稿者)
ご返信ありがとうございます。
■No21732 (シャノン さん) に返信
> ■No21728 (小春 さん) に返信
> ExpandableTypeConverter を使っているということは、PropertyGrid 中で、例えば Form.Size のように展開できるプロパティなのでしょうか?
そうです。
> hogeclass にはプロパティが1つしかありませんので、展開しても無意味な気がしますが…
もちろん1つではありません、投稿用に1つとしてます。
> まぁそれはそれとして、ExpandableTypeConverter は、PropertyGrid から HOGE プロパティに設定された文字列を、hogeclass.S に代入するんだという知識を持っていませんので、独自の TypeConveter を作って、ConvertFrom/To で文字列と hogeclass の相互変換を実装してやらないといけないんだと思います。
実装はしてみたものの、特に変わりませんでした(T_T)
型コンバータ実装部を
[TypeConverter(typeof(ExpandableObjectConverter))]
↓
[TypeConverter(typeof(hogeclassConverter))]
に変更。
//★ExpandableObjectConverterを継承したカスタムConverterの実装
public class hogeclassConverter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(hogeclass))
{
Console.WriteLine("CanConvertTo:True");
return true;
}
Console.WriteLine("CanConvertTo:False");
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value is hogeclass)
{
Console.WriteLine("ConvertTo:string");
hogeclass cc = (hogeclass)value;
return cc.S;
}
Console.WriteLine("ConvertTo:not string");
return base.ConvertTo(context, culture, value, destinationType);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
Console.WriteLine("CanConvertFrom:string");
return true;
}
Console.WriteLine("CanConvertFrom:not string");
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
Console.WriteLine("ConvertFrom:hogeclass");
string[] ss = value.ToString().Split(new char[] { ',' }, 0);
hogeclass cc = new hogeclass();
cc.S = ss[0];
return cc;
}
Console.WriteLine("ConvertFrom:not hogeclass");
return base.ConvertFrom(context, culture, value);
}
}
Console.WriteLineが出力されないのが不明なんですが、
実装ロジックがまずいのか、なにか根本的なものがまずいのか…。
もう少し調べてみます…。