2011-07-01 20 views
5

He realizado todo el recorrido en MSDN como de costumbre, no valen nada, es extremadamente limitado.VS 2010 Report Viewer no puede acceder a las colecciones anidadas, ¿alguien?

Si hago que el objeto interno de mi clase sea de una sola clase, puedo mostrar la información, pero tan pronto como la convierto en una lista de objetos (una colección) obtengo el #Error en la pantalla.

Aquí hay un ejemplo actualizado.

Por ejemplo tengo un objeto Persona que puede tener uno o más números de teléfono (lista de números) y no puedo encontrar la manera de acceder a los números de teléfono.

[Serializable] 
public class Person 
{ 
    private readonly List<PhoneNumber> _numbers = new List<PhoneNumber>(); 

    public Person() 
    { 
    } 

    public Person(int id, string name, string address, decimal salary) 
    { 
     Id = id; 
     Name = name; 
     Address = address; 
     Salary = salary; 
    } 

    public void AddNumber(PhoneNumber number) 
    { 
     _numbers.Add(number);    
    } 


    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 

    public List<PhoneNumber> PhoneNumbers { get { return _numbers; } }  

} 

[Serializable] 
public class PhoneNumber 
{ 
    public PhoneNumber() 
    { 
    } 

    public PhoneNumber(int id, string areaCode, string phone) 
    { 
     AreaCode = areaCode; 
     Id = id; 
     Phone = phone; 
    } 

    public string AreaCode { get; set; } 
    public string Phone { get; set; } 
    public int Id { get; set; } 
} 

Entonces pueblan las colecciones.

var persons = new List<Person>(); 

    var t = new Person(1, "Mike", "5150 Nuts", 125); 

    t.AddNumber(new PhoneNumber(1, "425", "455")); 
    t.AddNumber(new PhoneNumber(1, "425", "450")); 

    persons.Add(t); 

    t = new Person(2, "Tom", "1055 MS HAS NO DOCUMENTATION AS USUAL!", 1245); 

    t.AddNumber(new PhoneNumber(2, "TYPICAL", "OF-THEM")); 
    t.AddNumber(new PhoneNumber(2, "ANY", "ONE???")); 

    persons.Add(t); 

A continuación, asigno todo al informe.

reportViewer1.ProcessingMode = ProcessingMode.Local; 
    reportViewer1.LocalReport.ReportPath = "..\\..\\Report1.rdlc"; 
    reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Person",persons)); 
    reportViewer1.RefreshReport(); 

En el informe se muestra la gente va a mostrar sin problema ya que añadir los cuadros de texto para una lista y luego agrupar la lista por Id. Cuando trato de mostrar los números de teléfono, aparece el mensaje #ERROR y, por mi vida, parece que no puedo encontrar la manera de mostrar la lista de números asignados a una persona.

Si cambio el objeto de List<PhoneNumber> dentro de la clase de persona PhoneNumber puedo acceder a ella, pero cuando se trata de mostrar una List<PhoneNumber> no puedo.

Necesito ser ale para mostrar List<of objects> dentro de un elemento de clase.

+0

¿Cómo se formatea el informe? Me parece que solo necesita agrupar el informe por nombre, con los números que componen el detalle. –

+0

El problema que tengo es que ni siquiera puedo acceder a los números de teléfono. Todo lo que se muestra cuando creo el objeto es Nombre y Dirección en el diseñador del informe real. Estoy usando VS2010 y no puedo tener acceso a los números de teléfono. Realmente necesito la capacidad de acceder a la lista anidada. ¿alguna idea? – nitefrog

+0

¿Qué te hizo pensar que esto funcionaría? ¿Alguna vez has visto un ejemplo? Tenga en cuenta que la mayoría de las fuentes de datos de servicios de informes son, efectivamente, planas. –

Respuesta

2

La colección anidada se debe mostrar como un subinforme donde la colección anidada es una fuente de datos independiente. Debe vincular el evento LocalReport.SubreportProcessing a un controlador que filtrará y vinculará la fuente de datos (PhoneNumbers) al subinforme como un origen de datos de informe independiente. El ejemplo en el enlace provisto debe llevarlo a donde necesita ir.

+0

¡Gracias! Funcionó perfectamente! – nitefrog

Cuestiones relacionadas