質問

だから、多分これは悪いデザインかもしれません。知らない。しかし、私が持っていると言います DataTable 保持する列付き int 値;これらの値は、実際にはいくつかを表すことを意図しています enum 私がプロジェクトに持っているタイプ。

私がやりたいのは持っていることです DataGridView このテーブルに縛られ、列にの名前を表示させます enum 整数値「0」または「1」などではなく。

私が検討した1つの選択肢は、正規化全体を行うことでした。 DataSet とともに enum その中に名前が付けられています enum 値、そして私の最初のテーブルに参照を保持させます これ テーブル。

しかし、これはです enum- 特定のアイデア。一般的に、自分で書くことができるかどうか知りたい IFormatProviderICustomFormatter 実装*特定のタイプとそのフォーマッタを使用して、の値が特定の列に表示される方法を制御する 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();
    }

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top