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.

¿Fue útil?

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();
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top