4

したがって、これは悪い設計である可能性があります。知らない。しかし、値DataTableを保持する列があるとします。intこれらの値は、実際enumには、私のプロジェクトにある型を表すことを意図しています。

私がやりたいのは、DataGridViewこのテーブルにバインドし、列enumに整数値「0」または「1」などではなく、の名前を表示させることです。

私が検討したオプションの 1 つは、正規化全体を行うことでした。名前を含むテーブルを に追加DataSetenumenum値をキーにして、最初のテーブルにこのテーブルへの参照を保持させます。

しかし、これは特定の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 に答える