ReportViewer y Colecciones de Objetos

02/10/2007 - 17:47 por Gonzalo Rodríguez Carrera | Informe spam
Hola a todos,

Estoy intentando crear un informe usando (en Windows.Forms) el
ReportViewer y llevo ya un buen rato rompiendome los dedos buscando en
internet algo que me oriente un poquito a como debo hacer. Así que
nuevamente les pido ayuda.
Gracias de antemano.

El caso es que yo tengo una coleccion clsColePersona, formada por
objetos de clase clsPersona y quiero hacer un report con el
ReportViewer que me lea los datos de dicha colección...

Yo ya he intentado añadir en los origenes de datos a la clase
clsColePersona pero solo me salen propiedades de la misma clase y no
de las clases clsPersona (asi que no se como "enlazar" los datos con
el report) y si, en cambio, añado a la clase persona no me muestra
dato alguno...

¿Alguien me puede echar un cable?
Nuevamente gracias.

Gonzalo Rodríguez Carrera
MarkaSoftware.

¿Qué son 8 bocabits juntos? ...pues un bocabyte
 

Leer las respuestas

#1 Gonzalo Rodríguez Carrera
03/10/2007 - 12:58 | Informe spam
Hola Grupo.

Me llevó ayer todo el día y buena parte de la noche... y es una
tontería (casi me da vergüenza ponerlo...) pero, aquí dejo la
respuesta por si a alguien le sirve.
De todos modos seguro que hay miles de formas de hacerlo mejor...
mucho mejor. Si alguien sabe alguna mejor que lo ponga o si quiere
corregirme en algo. Encantado estaré de recibir críticas (es como se
mejor se mejora y puesto que apenas llevo un mes con C#) :P

El objetivo es lanzar un Informe en el que se liste, por ejemplo,
código, nombre y apellidos de personas usando el Reporting Services
que trae Visual Studio 2005 Prof. Es decir SIN Crystal Reports.
El ambiente usado es Windows Forms.

Para mi caso en particular tengo una colección "clsColeccionPersona"
cuyos miembros son de una clase "clsPersona".

La clase clsPersona pues tiene sus propiedades y demás métodos, no
hace falta ponerlas supongo.
La clase clsColección persona es la siguiente (la dejo aquí porque era
donde yo tenia el problema y si le ayuda a otro pues eso ;P )

==[inicio] clsColeccionPersonas using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

public class clsColeccionPersonas : CollectionBase
{
private List<clsPersona> m_persona;
private string mensaje = "";

/// <summary>
/// Constructor de la Coleccion Personas
/// </summary>
/// <param name="boolCargar">Boolean. Indica si debe cargar todos
los elementos o no</param>
public clsColeccionPersonas(Boolean boolCargar)
{
m_persona = new List<clsPersona>();
if (boolCargar)
this.CargarColeccion();
}

public bool CargarColeccion()
{
[ ... ] Aquí iría el código de carga de la colección.
}

// Para acceder a los elementos mediante []
// ...a los novatillos como yo. Esto es súper cómodo.
public clsPersona this[int index]
{
get { return ((clsPersona)m_persona[index]); }
set { m_persona[index] = value; }
}

// Añadir
public bool Add(clsPersona value)
{
try
{
m_persona.Add(value);
return true;
}
catch
{
this.mensaje = "Error en método 'Add'. No se ha insertado el
objeto";
return false;
}
}

public int IndexOf(clsPersona value)
{
return (m_persona.IndexOf(value));
}

public void Insert(int index, clsPersona value)
{
m_persona.Insert(index, value);
}

public void Remove(clsPersona value)
{
m_persona.Remove(value);
}

public bool Contains(clsPersona value)
{
return (m_persona.Contains(value));
}

// Esto es lo que me faltaba en la clase y por eso me atasqué:
// Un método que devuelva TODA la lista de objetos.
public List<clsPersona> GetItems()
{
return m_persona;
}
}

[Fin] clsColeccionPersonas==

Después por otro lado creé un formulario con el objeto reportViewer
(está en el Cuadro de Herramientas, es el último elemento)
y en el panel de tareas (no sé muy bien como se llama, el panelcito
que se despliega al pulsar un triángulo que aparece
en la parte de arriba a la derecha del objeto reportViewer al
seleccionarlo) le dí a "Diseñar nuevo informe"

Abrí el panel de Origen de Datos y elegí "objeto", después seleccioné
la calse "clsColeccionPersonas" y apareció un árbol con las
propiedades que tengo disponibles de las clases miembro de
clsColeccionPersonas, es decir de "clsPersona".

Después añadí una Tabla al diseñador de informes y en la fila del
medio puse los siguientes elementos (se pueden arrastrar desde el
panel Origen de Datos)
1a Celda: =Fields!Id.Value
2a Celda: =Fields!Nombre.Value
3a Celda: =Fields!Apellidos.Value

En la fila de arriba puse los títulos de los campos y en la de abajo,
para probar añadi ="Total Personas: " & Count(Fields!Id.Value) lo cual
me devolvería el total de personas del listado.

(Nota. Id , Nombre y Apellidos corresponden con propiedades de
clsPersona)

por último, añadí en el "Load" del formulario el siguiente código:

==[inicio] Load del formulario // ahora usamos el famoso método que me faltaba
this.clsColeccionPersonasBindingSource.DataSource colPersonas.GetItems();
this.reportViewer1.RefreshReport();
==[fin] Load del formulario ==
(Nota: el objeto clsColeccionPersonasBindingSource se crea
automáticamente al asociar la clase como origen de datos)

Tras todo esto (espero no haber olvidado nada) puedes lanzar el
formulario y cargará el report sin problemas.


Espero que a alguien le sirva.
Un saludo a todos e insisto si alguien quiere corregirme, por favor,
lo haga.

Xau Xau.
Gonzalo Rodríguez Carrera
MarkaSoftware.

Preguntas similares