[CR] Usando Listas para llenar nuestros informes (II).

Introducción

En el post anterior hemos visto como definir un informe en base a una clase propia y enlazarlo a una lista genérica desde VS.

Otra característica que se añadio con VS 2005 y que hoy en día es bastante utilizada, son los tipos de datos “Nullables” o la versión de El Guille.

A la hora de definir una clase que tenga este tipo de datos, nos vamos a encontrar con un problema a la hora de enlazarlo al informe en tiempo de ejecución:

 

 

¿Cómo Solucionarlo?

Como normalmente digo, esto es una aproximación y no creo que sea la mejor. Como también comente en el post anterior el ejemplo lo he basado en VS2005.

Partiendo de la clase cPersona donde la propiedad ID es de tipo Nullabe of Int:

 

   1: public class cPersona

   2:  {

   3:      public cPersona()

   4:      {

   5:  

   6:      }

   7:      private int? _ID;

   8:  

   9:      public int? ID

  10:      {

  11:          get { return _ID; }

  12:          set { _ID = value; }

  13:      }

  14:      private string _Nombre;

  15:  

  16:      public string Nombre

  17:      {

  18:          get { return _Nombre; }

  19:          set { _Nombre = value; }

  20:      }

  21:  }

Vamos a definir una serie de funciones que van a modificar los datos para evitar el problema anterior:

La función de este fragmento va a devolver el tipo de dato Original a través de Expresiones Regulares.

   1: public static Type ObtenerTipo(string Dato)

   2: {

   3:     string valores="System.String";

   4:     try

   5:     {

   6:         valores = Regex.Split(Dato, @"(d*[|s*])")[2];   

   7:     }

   8:     catch (Exception)

   9:     {

  10:  

  11:         valores = "System.String";

  12:     }

  13:     return Type.GetType(valores);

  14: }

Y la función importante va a encargarse de definir un objeto de Tipo DataTable que posteriormente enlazaremos a nuestro informe:

   1: public static DataTable GetDataTableNotNullable(List<cPersona> listado)

   2:         {

   3:             DataTable dt = new DataTable();

   4:             DataColumn col;

   5:             DataRow row;

   6:             Object val;

   7:             foreach (PropertyInfo prop in listado[0].GetType().GetProperties())

   8:             {

   9:                 col = new DataColumn(prop.Name);

  10:                 if (!prop.PropertyType.ToString().Contains("Nullable"))

  11:                     col.DataType=prop.PropertyType;

  12:                 else

  13:                     col.DataType = ObtenerTipo(prop.ToString());

  14:                 dt.Columns.Add(col);

  15:             }

  16:             

  17:             foreach (cPersona persona in listado)

  18:             {

  19:                 row = dt.NewRow();

  20:                 foreach (PropertyInfo prop in persona.GetType().GetProperties())

  21:                 {

  22:                     val = prop.GetValue(persona, null);

  23:                     if (val == null) val = DBNull.Value;

  24:                     row[prop.Name] = val;

  25:                 }

  26:                 dt.Rows.Add(row);

  27:             }

  28:             return dt;

  29:         }

 

Os dejo el enlace al proyecto para que le deis un vistazo.

 

Bueno espero que os sea de utilidad.

 

Saludos!

 

PD: Se podría hacer con métodos extensores y quedaría muy bien :-D!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *