Utilizzo di una formattazione personalizzata in un DataGridView
-
30-09-2019 - |
Domanda
Quindi, forse questo è un disegno male; Non lo so. Ma dice che ho un DataTable
con una colonna che contiene i valori int
; questi valori sono in realtà lo scopo di rappresentare un certo tipo enum
che ho nel mio progetto.
Quello che mi piacerebbe fare è avere un DataGridView
legato a questa tabella e avere la visualizzazione delle colonne il nome del enum
piuttosto che il valore intero "0" o "1" o qualsiasi altra cosa.
Una possibilità ho considerato è stato quello di fare tutta la normalizzazione cosa: aggiungere una tabella nella DataSet
con i nomi enum
in esso, calettati sui valori enum
, e avere il mio primo tavolo mantenere un riferimento a questo tavolo.
Ma questa è un'idea enum
-specifica. Vorrei sapere se, in generale, posso scrivere il mio IFormatProvider
e ICustomFormatter
implementazione * per un determinato tipo e l'uso che di formattazione per controllare come i valori vengono visualizzati in una data colonna di un controllo DataGridView
(o realmente in qualsiasi di controllo, se è per questo).
* Questo è solo il modo ho il sospetto che sarebbe stato fatto, se quello che sto chiedendo è possibile a tutti. Io non sono veramente morto-set sull'utilizzo di queste interfacce a tutti.
Soluzione
E 'possibile infatti implementare un ICustomFormatter
personalizzato, ma a causa di qualche retardedness da parte del DataGridView
, è necessario dire in realtà è come applicare la formattazione.
Il primo set column.DefaultCellStyle.FormatProvider
a un'istanza della classe formattazione personalizzata. Poi, gestire l'evento 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;
}
}
La classe formattatore sarebbe simile a questa:
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();
}
}