Frage

Also, vielleicht ist dies ein schlechtes Design; Ich weiß es nicht. Aber sagen, ich habe eine DataTable mit einer Spalte, die int Werte hält; Diese Werte sind in der Tat bedeutet einige enum Art darzustellen, dass ich in meinem Projekt habe.

Was ich möchte, ist, zu tun hat, ein DataGridView diese Tabelle gebunden und haben die Spaltenanzeige die Namen des enum statt dem Integer-Wert „0“ oder „1“ oder was auch immer.

Eine Option, die ich in Betracht gezogen war die ganze Normalisierung, was zu tun: Fügen Sie eine Tabelle in der DataSet mit den enum Namen darin, auf den enum Werte eingegeben haben, und habe meine erste Tabelle halten einen Verweis auf diese Tabelle.

Aber das ist eine enum spezifische Idee. Ich würde gerne wissen, ob im Allgemeinen kann ich meine eigene IFormatProvider und ICustomFormatter Implementierung * für einen bestimmten Typen schreiben und diese Formatierer zu steuern, wie Werte in einer bestimmten Spalte einer DataGridView Kontrolle angezeigt (oder wirklich in jeder Kontrolle, was das betrifft).

* Dies ist nur, wie ich vermute, es wäre geschehen, wenn das, was ich frage überhaupt möglich ist. Ich bin nicht wirklich tot-Set auf diese Schnittstellen an alle mit.

War es hilfreich?

Lösung

Sie können in der Tat eine benutzerdefinierte ICustomFormatter implementieren, aber aufgrund einiger Geblieben auf dem Teil des DataGridView, müssen Sie es tatsächlich sagen, wie Ihr Formatierer anwenden.

Sie zuerst column.DefaultCellStyle.FormatProvider auf eine Instanz der benutzerdefinierten Formatierung Klasse. Dann behandeln Sie das CellFormatting Ereignis:

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;
    }
}

Die Formatter-Klasse würde wie folgt aussehen:

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();
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top