winform sort programmatic objects ejemplo databind column winforms datagridview string-formatting iformatprovider

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.