DatagridViewでカスタムフォーマッタを使用します
-
30-09-2019 - |
質問
だから、多分これは悪いデザインかもしれません。知らない。しかし、私が持っていると言います DataTable
保持する列付き int
値;これらの値は、実際にはいくつかを表すことを意図しています enum
私がプロジェクトに持っているタイプ。
私がやりたいのは持っていることです DataGridView
このテーブルに縛られ、列にの名前を表示させます enum
整数値「0」または「1」などではなく。
私が検討した1つの選択肢は、正規化全体を行うことでした。 DataSet
とともに enum
その中に名前が付けられています enum
値、そして私の最初のテーブルに参照を保持させます これ テーブル。
しかし、これはです enum
- 特定のアイデア。一般的に、自分で書くことができるかどうか知りたい IFormatProvider
と ICustomFormatter
実装*特定のタイプとそのフォーマッタを使用して、の値が特定の列に表示される方法を制御する DataGridView
コントロール(または実際に どれか コントロール、その点で)。
*これは、私が求めていることがまったく可能であれば、それが行われると思われる方法です。私はこれらのインターフェイスをまったく使用することにまったくデッドセットではありません。
解決
実際、カスタムを実装できます 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();
}
}