El uso de un formateador personalizado en un DataGridView
-
30-09-2019 - |
Pregunta
Así que, tal vez esto es un mal diseño; No lo sé. Pero decir que tengo un DataTable
con una columna que contiene valores int
; estos valores son, de hecho, supone que representan algún tipo enum
que tengo en mi proyecto.
Lo que me gustaría hacer es tener un DataGridView
con destino a esta tabla y tener la presentación de la columna el nombre del lugar de enum
el valor entero "0" o "1" o lo que sea.
Una opción que consideré era hacer todo el asunto de normalización: agregar una tabla en el DataSet
con los nombres enum
en él, cerrado en los valores enum
, y tener mi primera tabla del asimiento de una referencia a este mesa.
Sin embargo, esta es una idea enum
específica. Me gustaría saber si, en general, puedo escribir mi propia IFormatProvider
y ICustomFormatter
aplicación * para un determinado tipo y el uso que formateador para controlar cómo los valores se muestran en una columna dada de un control DataGridView
(o realmente en cualquier de control, para el caso).
* Esto es lo que sospecho que sería hecho, si lo que estoy pidiendo es posible en absoluto. No estoy realmente muerto-set en el uso de estas interfaces en absoluto.
Solución
Si lo necesitas puedes poner en práctica un ICustomFormatter
costumbre, pero debido a algunos retardedness por parte de la DataGridView
, es necesario decir que en realidad la forma de aplicar el formateador.
En primer lugar establece column.DefaultCellStyle.FormatProvider
a una instancia de la clase de formato personalizado. A continuación, controlar el 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 clase de formateador sería algo como esto:
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();
}
}