2011-01-12 8 views
10

मुझे पता है कि मैं इसे कस्टम टाइप डिस्क्रिप्टर इत्यादि लिखकर कर सकता हूं, हालांकि यह आवश्यकता कितनी सरल है; क्या मुझे ऐसा करने का एक आसान तरीका याद आ रहा है।मैं कैसे एक बूल संपत्ति दिखा सकता हूं हां | संपत्ति ग्रिड में नहीं?

बूलेन कनवर्टर में "सत्य" और "झूठी" के लिए स्ट्रिंग सेट करने में सक्षम होने की मुझे आवश्यकता हो सकती है, लेकिन स्टैंड बुलियन कनवर्टर आपको कस्टम स्ट्रिंग सेट करने की प्रतीत नहीं करता है।

उत्तर

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

धन्यवाद, बंद करें, लेकिन जब मैं मूल्य पर डबल क्लिक करता हूं तो मुझे एक त्रुटि डीएलजी मिलती है "संपत्ति मान वैध नहीं है"/"प्रकार का ऑब्जेक्ट 'सिस्टम। स्ट्रिंग' को 'System.Boolean' प्रकार में परिवर्तित नहीं किया जा सकता है।" –

+0

उह, पिटा। रनटाइम पर इसे डिबग करने के लिए प्रॉपर्टीग्रिड को किसी फ़ॉर्म पर रखें। –

+1

आपको बस्ट के बजाय कास्ट के बजाय सिस्टम :: कनवर्ट :: ToBoolean (value) की आवश्यकता हो सकती है। – ThePragmatist

3

तुम एक enum का उपयोग करके एक कस्टम कनवर्टर को लागू करने से बच सकते हैं:

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; } 
} 

के रूप में है, इस समाधान स्थानीयकृत किए जाने योग्य नहीं है, और आप/बंद "पर के हर क्रमचय के लिए एक enum लागू करने के लिए होगा "मूल्य जोड़े जो आप उपयोग करना चाहते थे। लेकिन, यह एक-एक के लिए सरल जवाब है।

संबंधित मुद्दे

 संबंधित मुद्दे