在DataGridView中使用自定义格式化程序

时间:2010-08-23 20:48:25

标签: winforms datagridview string-formatting iformatprovider

所以,也许这是一个糟糕的设计;我不知道。但是我说我的DataTable列中包含int个值;这些值实际上是代表我在项目中使用的enum类型。

我想要做的是将DataGridView绑定到此表,并使列显示enum的名称,而不是整数值“0”或“1”或其他

我考虑的一个选项是执行整个规范化的事情:在DataSet中添加一个表格,其中包含enum个名称,以enum值键入,并拥有我的第一个table保存对 this 表的引用。

但这是一个enum特定的想法。我想知道,一般来说,我是否可以为给定类型编写自己的IFormatProviderICustomFormatter实现*,并使用该格式化程序来控制值在{{的给定列中的显示方式1}}控制(或者实际上在任何控件中)。

*这就是我怀疑它会如何完成,如果我所要求的是可能的话。我根本没有完全使用这些接口。

1 个答案:

答案 0 :(得分:12)

您确实可以实现自定义ICustomFormatter,但由于DataGridView的某些延迟,您需要实际告诉它如何应用您的格式化程序。

首先将column.DefaultCellStyle.FormatProvider设置为自定义格式类的实例。然后,处理CellFormatting事件:

void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
    if (e.CellStyle.FormatProvider is ICustomFormatter) {
        e.Value = (e.CellStyle.FormatProvider.GetFormat(typeof(ICustomFormatter)) as ICustomFormatter).Format(e.CellStyle.Format, e.Value, e.CellStyle.FormatProvider);
        e.FormattingApplied = true;
    }
}

格式化程序类看起来像这样:

public class MyEnumFormatter : IFormatProvider, ICustomFormatter {

    public object GetFormat(Type formatType) {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider) {
        return ((NameOfEnumType)Convert.ToInt32(arg)).ToString();
    }

}