2009-09-09 7 views
0

Je travaille avec MS Reporting Services. La source de données sous-jacente estMicrosoft Reporting avec Collection en tant que DataSource

IEnumerable<MyObject>, je n'utilise pas DataSets. Tous les MyObject ont des propriétés et d'autres collections IEnumerable. Dans le rapport, je souhaite afficher toutes les propriétés de MyObject et également les listes de collections. Je ne savais pas comment afficher ces collections internes, donc j'ai fait un SubReport auquel j'ai passé le MyObject .Id afin que le SubReport puisse récupérer l'objet lui-même et Construire la DataSource pour ces collections internes. Je le fais dans cet événement.

myReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); 

private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) 
{ 
    int id; 
    if (e.Parameters.Count > 0 && int.TryParse(e.Parameters[0].Values[0], out id)) 
    { 
     MyObject current = myObjects.Where(x => x.MyObject.Id == id).FirstOrDefault(); 

     InnerListBindingSource.DataSource = current.InnerCollection; 
     e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource(
      "MyInnerCollectionDataSource", InnerListBindingSource)); 
    } 
} 

Mais il y a toujours "Le sous-rapport n'a pas pu être affiché" dans mon rapport principal. (Rapport principal - les sous-rapports sont correctement liés)

Une idée Pourquoi? Ou comment résoudre cela d'une manière plus élégante?

Merci

Répondre

1

OK.

donc je suis allé à cette solution et cela fonctionne:

private IEnumerable<MyObject> myObjects; 

public ReportViewerForm(IEnumerable<MyObject> myObjects) 
{ 
    InitializeComponent(); 

    this.myObjects = myObjects; 
    this.WindowState = FormWindowState.Maximized; 

    ReportViewer reportViewer = new ReportViewer();    

    reportViewer.ProcessingMode = ProcessingMode.Local; 

    reportViewer.LocalReport.ReportEmbeddedResource = @"SomePath." + "Report1.rdlc"; 
    /*reportViewer.LocalReport.ReportPath = @"SomePath\Report1.rdlc"; */ 

    reportViewer.LocalReport.SubreportProcessing += 
       new SubreportProcessingEventHandler(SubreportProcessingEventHandler);    

    reportViewer.LocalReport.DataSources.Add(
     new ReportDataSource("MyDataSource", myObjects)); 

    reportViewer.LocalReport.SetParameters(new List<ReportParameter> 
    { 
     new ReportParameter("param1", ..WhatEver..), 
     ... 
    }); 

    reportViewer.Dock = DockStyle.Fill; 
    this.panel1.Controls.Add(reportViewer); 

    reportViewer.RefreshReport(); 
} 

void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e) 
{   
    /* For example ID parsing.. when you have it defined in .rdlc file.. */ 
    int id; 
    if (e.Parameters.Count > 0 && int.TryParse(e.Parameters[0].Values[0], out id)) 
    { 
     MyObject current = myObjects.Where(x => x.MyObject.Id == id).FirstOrDefault(); 

     e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource(
      "InnerListDataSource", current.InnerList));    
    }   
} 
0

Si je comprends bien, vous avez une structure qui ressemble à une table. Alors pourquoi ne prenez-vous pas un DataTable? ReportingServices offre un accès facile à ceux-ci. Ou est-ce que je me suis trompé là-bas?

+0

Cette collection est extraite de ObjectRelational Mapper, et il contient des objets ForeignKey, les collections étrangères, etc. Je dois reconstruire faire DataTable .. Pensez-vous que c'est une bonne approche? –

+0

Honnêtement: Je ne sais pas. Mais un DataSet/DataTable est généralement un bon choix pour mapper à partir d'une source de données relationnelle. DataSet offre la plupart des fonctionnalités d'une base de données, et une table est la structure de base d'une source de données relationnelle. J'ai seulement travaillé avec une Table jusqu'à maintenant, donc je suppose que cela pourrait aussi être la raison pour laquelle je les choisirais à nouveau. :) – StampedeXV

+0

Je suppose que cela dépend à quel point il est difficile de récupérer un DataTable par rapport à la résolution de votre problème. – StampedeXV

Questions connexes