是否可以格式化显示在 winforms 的 PropertyGrid 中的数字属性?
class MyData
{
public int MyProp {get; set;}
}
例如,我希望它在网格中显示为 1.000.000。
这有一些属性吗?
是否可以格式化显示在 winforms 的 PropertyGrid 中的数字属性?
class MyData
{
public int MyProp {get; set;}
}
例如,我希望它在网格中显示为 1.000.000。
这有一些属性吗?
您应该为您的整数属性实现自定义类型转换器:
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 的工作原理以及如何对其进行自定义。
我不知道直接在 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 中。
我有同样的问题,并提出了一个比 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
,但我不会对此进行深入探讨。