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.