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.

È stato utile?

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top