2016-08-18 13 views
0

私はPropertyGridに表示する整数プロパティを持つクラスを持っているとします。今度はPropertyGridは単に整数値を表示するのではなく、リストからの対応する文字列値と、さらにそのプロパティの可能な値(文字列として)を持つドロップダウンリストを表示すべきです。PropertyGridのintプロパティの文字列を提供します

私はこのためにTypeConverterを使用しなければならないことを知っています。これは過去に文字列プロパティに対して行っています。しかし、私はこれがどのように行われなければならないのか理解できません。あなたは私のコードからわかるように、私は完全に無力だ:

class MyClassConverter : TypeConverter 
{ 
    List<string> values = new List<string>(); 

    public MyClassConverter() 
    { 
     values.Add("Value1"); 
     values.Add("Value2"); 
     values.Add("Value3"); 
    } 

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     bool ret = true; //base.CanConvertFrom(context, sourceType); 
     Debug.Print("CanConvertFrom: " + sourceType.ToString() + " " + ret.ToString()); 
     return ret; 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     bool ret = base.CanConvertTo(context, destinationType); 
     Debug.Print("CanConvertTo: " + destinationType.ToString() + " " + ret.ToString()); 
     return ret; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     Debug.Print("ConvertFrom: " + value.GetType().ToString()); 
     //return base.ConvertFrom(context, culture, value); 
     for (int i = 0; i < values.Count; i++) 
     { 
      if (values[i] == value) 
      { 
       return i; 
      } 
     } 
     return -1; 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     Debug.Print("ConvertTo: " + destinationType.ToString()); 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
     Debug.Print("GetStandardValues"); 
     StandardValuesCollection collection = new StandardValuesCollection(values); 
     return collection; 
    } 

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

最短修正はそれではないだろう、プロパティ列挙型を作ることでしょうか? –

+0

私の場合はありません。リストの値はユーザーによって入力されます。 –

答えて

0

あなたがプロパティグリッドに話しているので、あなたは、入力(および出力として暗黙のstring型としてintタイプでConvertToを実装する必要があります)。あなたが直接エンドユーザーint入力をサポートする場合

また、あなたがintstringとして(例えば「2」のような)からConvertFromを実装することも必要です。ここで

動作しているようですコードの一部です:

public class MyClassConverter : TypeConverter 
{ 
    private List<string> values = new List<string>(); 

    public MyClassConverter() 
    { 
     values.Add("Value1"); 
     values.Add("Value2"); 
     values.Add("Value3"); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     if (value is int) 
     { 
      int index = (int)value; 
      if (index >= 0 && index < values.Count) 
       return values[index]; 

      return values[0]; // error, go back to first 
     } 
     return value; 
    } 

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

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string s = value as string; 
     if (s != null) 
     { 
      int index = values.IndexOf(s); 
      if (index >= 0) 
       return index; 

      // support direct integer input & validate 
      if (int.TryParse(s, out index) && index >= 0 && index < values.Count) 
       return index; 

      return 0; // error, go back to first 
     } 

     return base.ConvertFrom(context, culture, value); 
    } 

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

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
} 
関連する問題