【问题标题】:How do I show a bool property as Yes|No in the property grid?如何在属性网格中将布尔属性显示为 Yes|No?
【发布时间】:2011-01-12 13:43:57
【问题描述】:

我知道我可以通过编写自定义类型描述符等来做到这一点,但是考虑到这个要求是多么简单;我错过了一种简单的方法吗?

能够在 BooleanConverter 中为“true”和“false”设置字符串可能是我所需要的,但标准的 BooleanConverter 似乎不允许您设置自定义字符串。

【问题讨论】:

    标签: .net winforms propertygrid


    【解决方案1】:

    您必须对其进行自定义。像这样:

    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 获得帮助以使其在其他语言中工作。

    【讨论】:

    • 谢谢,关闭,但是当我双击该值时,我得到一个错误 Dlg“属性值无效”/“'System.String' 类型的对象无法转换为'System.String' 类型。布尔值。”
    • 呃,皮塔饼。在表单上放置一个 PropertyGrid 以在运行时对其进行调试。
    • 您可能需要 System::Convert::ToBoolean(value) 而不是强制转换为 bool。
    • @Ian:您的 GetStandardValues 方法不应返回字符串数组,而是返回布尔数组。而且由于基础的 BooleanConverter 已经做到了,你可以完全删除这个方法。
    【解决方案2】:

    您可以避免使用枚举来实现自定义转换器:

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

    按原样,此解决方案不可本地化,您必须为要使用的“开/关”值对的每个排列实现一个枚举。但是,这是一次性的简单答案。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2012-01-21
      • 2011-08-23
      相关资源
      最近更新 更多