4

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

我想要做的是DataGridView绑定到这个表并让列显示名称enum而不是整数值“0”或“1”或其他。

我考虑的一个选择是做整个规范化的事情:在其中添加一个表,其中DataSet包含enum名称,键入enum值,并让我的第一个表包含对该表的引用。

但这是一个enum特定的想法。我想知道,一般来说,我是否可以为给定类型编写自己的IFormatProvider实现ICustomFormatter*,并使用该格式化程序来控制值如何在控件的给定列中显示DataGridView(或者真的在任何控件中,就此而言) .

*这就是我怀疑的方式,如果我问的是可能的话。我对使用这些界面并没有真正的死心塌地。

4

1 回答 1

12

您确实可以实现 custom 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();
    }

}
于 2010-08-26T14:51:52.070 回答