winforms - sort - Usar un formateador personalizado en un DataGridView
sort mode programmatic datagridview (1)
De hecho, puede implementar un ICustomFormatter
personalizado, pero debido a un retraso de parte de DataGridView
, realmente debe decirle cómo aplicar su formateador.
Primero configure column.DefaultCellStyle.FormatProvider
en una instancia de su clase de formato personalizada. A continuación, gestione 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 se vería así:
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();
}
}
Entonces, tal vez este es un mal diseño; No lo sé. Pero digo que tengo una DataTable
con una columna que contiene valores int
; estos valores están destinados a representar algún tipo de enum
que tengo en mi proyecto.
Lo que me gustaría hacer es tener un DataGridView
vinculado a esta tabla y hacer que la columna muestre el nombre de la enum
lugar del valor entero "0" o "1" o lo que sea.
Una opción que consideré fue hacer todo el asunto de la normalización: agregar una tabla en el DataSet
con los nombres enum
, con una clave en los valores enum
, y hacer que mi primera tabla mantenga una referencia a esta tabla.
Pero esta es una idea específica de enum
. Me gustaría saber si, en general, puedo escribir mi propia implementación IFormatProvider
e ICustomFormatter
* para un tipo dado y usar ese formateador para controlar cómo se muestran los valores en una columna determinada de un control DataGridView
(o realmente en cualquier control, para ese asunto).
* Así es como sospecho que se haría, si lo que estoy preguntando es posible en absoluto. No estoy realmente decidido a usar estas interfaces en absoluto.