所以,也许这是一个糟糕的设计;我不知道。但是我说我的DataTable
列中包含int
个值;这些值实际上是代表我在项目中使用的enum
类型。
我想要做的是将DataGridView
绑定到此表,并使列显示enum
的名称,而不是整数值“0”或“1”或其他
我考虑的一个选项是执行整个规范化的事情:在DataSet
中添加一个表格,其中包含enum
个名称,以enum
值键入,并拥有我的第一个table保存对 this 表的引用。
但这是一个enum
特定的想法。我想知道,一般来说,我是否可以为给定类型编写自己的IFormatProvider
和ICustomFormatter
实现*,并使用该格式化程序来控制值在{{的给定列中的显示方式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();
}
}