Unter Verwendung eines benutzerdefinierten Formatierer in einem Datagridview
-
30-09-2019 - |
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.
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();
}
}