C# 我是否可以在属性上使用属性来告诉DataGridView如何格式化列?

C# 我是否可以在属性上使用属性来告诉DataGridView如何格式化列?,c#,.net,datagridview,properties,attributes,C#,.net,Datagridview,Properties,Attributes,下面是一段,如果我有这门课: private class MyClass { [DisplayName("Foo/Bar")] public string FooBar { get; private set; } public decimal Baz { get; private set; } } 我想在DataGridView中显示列表(带有自动生成的列),让Baz列显示格式为货币的最简单方法是什么 是否有一个属性我可以像使用DisplayName一样使用,或者在创建列后我必须处

下面是一段,如果我有这门课:

private class MyClass {
  [DisplayName("Foo/Bar")]
  public string FooBar { get; private set; }
  public decimal Baz { get; private set; }
}
我想在
DataGridView
中显示
列表
(带有自动生成的列),让Baz列显示格式为货币的最简单方法是什么


是否有一个属性我可以像使用
DisplayName
一样使用,或者在创建列后我必须处理这些列?

我知道它并不完美,但您可以添加另一个名为CurrencyBaz的属性,它基本上会返回格式化的Baz,然后将其绑定到网格而不是真正的Baz

像这样

private class MyClass {
  [DisplayName("Foo/Bar")]
  public string FooBar { get; private set; }
  [Browsable(False)]
  public decimal Baz { get; private set; }
  [DisplayName("Baz")]
  public CurrencyBaz
  {
        get { return string.Format(Baz, "C2"); }
  }
}

TypeConverterAttribute
-类似于:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows.Forms;
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form { Controls = {
            new DataGridView {
                Dock = DockStyle.Fill,
                DataSource = new List<MyClass> {
                    new MyClass { FooBar = "abc", Baz = 123.45M},
                    new MyClass { FooBar = "def", Baz = 678.90M}
                }
            }
        }});
    }
}
class MyClass
{
    [DisplayName("Foo/Bar")]
    public string FooBar { get; set; }
    [TypeConverter(typeof(CurrencyConverter))]
    public decimal Baz { get; set; }
}
class CurrencyConverter : DecimalConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context,
        CultureInfo culture, object value)
    {
        string s = value as string;
        if (s != null) return decimal.Parse(s, NumberStyles.Currency, culture);
        return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context,
        CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return ((decimal)value).ToString("C2", culture);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
利用制度全球化;
使用System.Windows.Forms;
静态类程序
{
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.Run(新表单{Controls={
新DataGridView{
Dock=DockStyle.Fill,
数据源=新列表{
新MyClass{FooBar=“abc”,Baz=123.45M},
新MyClass{FooBar=“def”,Baz=678.90M}
}
}
}});
}
}
类MyClass
{
[显示名称(“Foo/Bar”)]
公共字符串FooBar{get;set;}
[TypeConverter(typeof(CurrencyConverter))]
公共十进制Baz{get;set;}
}
类CurrencyConverter:小数转换器
{
公共重写对象转换自(ITypeDescriptorContext上下文,
文化信息(文化,对象值)
{
字符串s=作为字符串的值;
如果(s!=null)返回decimal.Parse(s,NumberStyles.Currency,culture);
返回base.ConvertFrom(上下文、区域性、值);
}
公共重写对象转换为(ITypeDescriptorContext上下文,
CultureInfo区域性,对象值,类型destinationType)
{
if(destinationType==typeof(string))
{
返回((十进制)值).ToString(“C2”,区域性);
}
返回base.ConvertTo(上下文、区域性、值、destinationType);
}
}

这对我来说很有用(不过有点修正了;)。如果没有人能想出更好的方法,我会接受的。当然,尽管它不能正确对齐列。。对我正在做的事情来说已经足够好了:)我可以想出任何方法来修复对齐,这很酷,我必须记住这一点。但就目前而言,我正在创建的类只是一个私有的内部类,无论如何都要显示在列表中——因此,使用更少的代码并处理一个额外的属性a la Kay可能更好。答案是这样的。还有,很好的示例代码!我只是将整个内容粘贴到SnippetCompiler中,然后它就运行了。当然,将
CurrencyConverter
粘贴到标准库的某个地方,它就是一行-P