10

是否可以格式化显示在 winforms 的 PropertyGrid 中的数字属性?

class MyData
{
      public int MyProp {get; set;}
}

例如,我希望它在网格中显示为 1.000.000。

这有一些属性吗?

4

3 回答 3

15

您应该为您的整数属性实现自定义类型转换器:

class MyData
{
    [TypeConverter(typeof(CustomNumberTypeConverter))]
    public int MyProp { get; set; }
}

PropertyGrid 使用 TypeConverter 将您的对象类型(在本例中为整数)转换为字符串,用于在网格中显示对象值。在编辑期间,TypeConverter 从字符串转换回您的对象类型。

因此,您需要使用类型转换器,它应该能够将整数转换为带有千位分隔符的字符串,并将此类字符串解析回整数:

public class CustomNumberTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, 
                                        Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, 
        CultureInfo culture, object value)
    {            
        if (value is string)
        {
            string s = (string)value;
            return Int32.Parse(s, NumberStyles.AllowThousands, culture);
        }

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

    public override object ConvertTo(ITypeDescriptorContext context, 
        CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
            return ((int)value).ToString("N0", culture);

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

结果:

propertyGrid.SelectedObject = new MyData { MyProp = 12345678 };

在此处输入图像描述

我建议您阅读充分利用 .NET Framework PropertyGrid 控件 MSDN 文章以了解 PropertyGrid 的工作原理以及如何对其进行自定义。

于 2013-10-02T15:28:18.727 回答
7

我不知道直接在 PropertyGrid 中格式化属性的方法,但是您可以执行类似的操作

class MyData
{
    [Browsable(false)]
    public int _MyProp { get; set; }

    [Browsable(true)]
    public string MyProp
    {
        get
        {
             return _MyProp.ToString("#,##0");
        }
        set
        {
             _MyProp = int.Parse(value.Replace(".", ""));
        }
    }
}

只有Browsable(true)属性显示在 PropertyGrid 中。

于 2013-10-02T15:29:36.483 回答
1

我有同样的问题,并提出了一个比 Sergy 的答案更灵活的解决方案。它涉及 TypeConverter 和自定义属性。TypeConverter 负责执行转换,自定义属性告诉 TypeConverter 你希望字符串如何格式化。

我声明我的示例类如下:

class MyData
{
    [TypeConverter(typeof(FormattedDoubleConverter))]
    [FormattedDoubleFormatString("F3")]
    public double MyProp { get; set; }
}

类型转换器实现如下:

class FormattedDoubleConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || sourceType == typeof(double);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(string) || destinationType == typeof(double);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
                                       object value)
    {
        if (value is double)
            return value;

        var str = value as string;
        if (str != null)
            return double.Parse(str);

        return null;
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
                                     object value, Type destinationType)
    {
        if (destinationType != typeof(string))
            return null;

        if (value is double)
        {
            var property = context.PropertyDescriptor;
            if (property != null)
            {
                // Analyze the property for a second attribute that gives the format string
                var formatStrAttr = property.Attributes.OfType<FormattedDoubleFormatString>().FirstOrDefault();
                if (formatStrAttr != null)
                    return ((double)value).ToString(formatStrAttr.FormatString);
                else
                    return ((double)value).ToString();
            }
        }

        return null;
    }
}

请注意,TypeConverter 用于context.PropertyDescriptor查找FormattedDoubleFormatString提供“F3”格式字符串的属性。

该属性很简单,它只接受并保存格式字符串:

[AttributeUsage(AttributeTargets.Property)]
class FormattedDoubleFormatString : Attribute
{
    public string FormatString { get; private set; }

    public FormattedDoubleFormatString(string formatString)
    {
        FormatString = formatString;
    }
}

你有它。可重复用于任何格式的解决方案。您甚至可以通过将其更改为转换任何实现的类型,使其在某种程度上独立于类型IConvertable,但我不会对此进行深入探讨。

于 2019-03-22T00:47:57.400 回答