2011-01-12 9 views
10

私はカスタムタイプの記述子などを書くことでこれを行うことができますが、この要件がどれほど単純かを考えればわかります。私はそれを行う簡単な方法が欠けています。boolプロパティをプロパティグリッドにYes/Noとして表示するにはどうすればよいですか?

はBooleanConverterに「真」と「偽」の文字列を設定することができることはすべて私が必要かもしれないが、standared BooleanConverterは、カスタム文字列を設定できていないようです。

答えて

9

あなたはそれをカスタマイズする必要があります。

class YesNoConverter : BooleanConverter { 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { 
     if (value is bool && destinationType == typeof(string)) { 
      return values[(bool)value ? 1 : 0]; 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { 
     string txt = value as string; 
     if (values[0] == txt) return false; 
     if (values[1] == txt) return true; 
     return base.ConvertFrom(context, culture, value); 
    } 

    private string[] values = new string[] { "No", "Yes" }; 
} 

使用例:このよう

class MyControl : Control { 
    [TypeConverter(typeof(YesNoConverter))] 
    public bool Prop { get; set; } 
} 

あなたは他の言語で、この作業をするためにSystem.Globalizationからの助けを得るません。

+0

おかげで、近くに、私は値をダブルクリックしたときに、私はエラーDlgの取得「プロパティの値が有効ではない」/「オブジェクトタイプの 『可能System.String』型に変換することができない 『可能System.Boolean』。」 、 –

+0

うん、ピタ。実行時にこれをデバッグするために、フォームにPropertyGridを配置します。 –

+1

boolへのキャストの代わりにSystem :: Convert :: ToBoolean(value)が必要な場合があります。 – ThePragmatist

3

あなたは列挙型を使用して、カスタムコンバータを実装避けることができます:

public enum YesNo{No,Yes} 

... 

[Browsable(true)] 
public YesNo IsValueSet {get;set) 

[Browsable(false)] //also consider excluding it from designer serialization 
public bool ValueSetAsBool 
{ 
    get { return Convert.ToBoolean((byte)IsValueSet); } 
    set { IsValueSet = value ? YesNo.Yes : YesNo.No; } 
} 

ようになり、このソリューションはローカライズではなく、あなたは「オン/オフのすべての順列のための列挙を実装する必要があると思います"あなたが使いたいバリューペア。しかし、それは一回限りの簡単な答えです。

関連する問題