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

13z8s7eq  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(162)

所以,也许这是一个糟糕的设计;我不知道,但是假设我有一个DataTable,它的一列包含int的值;这些值实际上是用来表示项目中的enum类型。
我想做的是将一个DataGridView绑定到该表,并让该列显示enum的名称,而不是整数值“0”或“1”或其他值。
我考虑的一个选择是进行整个标准化:在DataSet中添加一个表,表中包含enum名称,以enum值为键,并让我的第一个表包含对 this 表的引用。
但这是一个特定于enum的想法。我想知道,一般来说,我是否可以为一个给定的类型编写自己的IFormatProviderICustomFormatter实现 *,并使用该格式化程序来控制值如何在DataGridView控件的给定列中显示(或实际上在 * 任何 * 控件中,就这一点而言)。

  • 如果我所要求的是可能的话,这只是我所怀疑的方式。我并不是真的死定要使用这些接口。
vkc1a9a2

vkc1a9a21#

您确实可以实现一个自定义的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();
    }

}

相关问题