2009-09-09 57 views
0

我正在与MS Reporting Services合作。基础数据源是微软将收集作为数据源报告

IEnumerable<MyObject>,我没有使用数据集。

每个MyObject都有属性和其他IEnumerable集合。 在报告中,我想显示来自MyObject和 的所有属性。 我不知道如何显示这个内部集合,所以我做了一个SubReport,我通过了MyObject.Id,以便SubReport可以自己检索对象并构建这些内部集合的数据源。 我在这个事件中这样做。

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

但是在我的主报告中总会有“子报表无法显示”。 (主报告 - 子报告被正确绑定)

任何想法为什么?或者如何以更优雅的方式解决这个问题?

谢谢

回答

1

好的。

于是我来到了这个解决方案,它的工作:

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

如果我正确理解你,你有一个类似于表的结构。那么,为什么你不采取DataTable? ReportingServices可轻松访问这些信息。 还是我让你错了?

+0

这个系列是从对象关系映射检索,它包含ForeignKey的对象,外交部集合等我不得不重建它做的DataTable ..你认为这是一个好方法吗? – 2009-09-09 08:27:32

+0

老实说:我不知道。但DataSet/DataTable通常是从关系数据源映射到的好选择。 DataSet提供DataBase所具有的大多数功能,而表是关系数据源的基本结构。直到现在,我只用了一张桌子,所以我想这也可能是我再次选择它们的原因。 :) – StampedeXV 2009-09-09 08:36:12

+0

我想这取决于检索DataTable与解决问题相比有多难。 – StampedeXV 2009-09-09 08:36:58