L'utilisation d'un formatter personnalisé dans un DataGridView
-
30-09-2019 - |
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.
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();
}
}