Question

Alors, peut-être cela est une mauvaise conception; Je ne sais pas. Mais que j'ai un DataTable avec une colonne qui contient les valeurs de int; ces valeurs sont en fait censées représenter un certain type de enum que j'ai dans mon projet.

Ce que je voudrais faire est d'avoir un DataGridView lié à cette table et ont l'affichage des colonnes le nom du enum plutôt que la valeur entière « 0 » ou « 1 » ou autre.

Une option que je considérais était de faire la chose de normalisation: ajouter une table dans le DataSet avec les noms de enum en elle, calée sur les valeurs enum, et ont ma première prise de table une référence à ce table.

Mais ceci est une idée spécifique à enum. Je voudrais savoir si, en général, je peux écrire mon propre IFormatProvider et ICustomFormatter mise en œuvre * pour un type donné et l'utiliser formatter pour contrôler la façon dont les valeurs sont affichées dans une colonne donnée d'un contrôle DataGridView (ou vraiment dans tout contrôle, pour cette matière).

* Ceci est juste que je pense que ce serait fait, si ce que je demande est possible du tout. Je ne suis pas mort mis sur l'utilisation de ces interfaces du tout.

Était-ce utile?

La solution

Vous pouvez en effet mettre en œuvre un ICustomFormatter personnalisé, mais en raison de certains arriération de la part de la DataGridView, vous devez dire réellement comment appliquer votre formatter.

D'abord mis column.DefaultCellStyle.FormatProvider à une instance de votre classe personnalisée mise en forme. Ensuite, gérer l'événement 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 formatter ressemblerait à quelque chose comme ceci:

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top