Microsoft使用Collection作为DataSource进行报告

时间:2009-09-09 08:15:10

标签: reporting-services reporting

我正在使用 MS Reporting Services 。基础数据源是

IEnumerable<MyObject>,我没有使用DataSet。

每个MyObject都有属性和其他一些IEnumerable个集合。 在报告中,我想显示MyObjectMyObject中的所有属性 收藏品也列出了。 我不知道如何显示这个内部集合,所以我创建了一个 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)); } } 。Id,以便SubReport可以自己检索对象并构建这些内部集合的DataSource。 我在这个活动中这样做。

{{1}}

但在我的主报告中始终存在“子报告无法显示”。 (主报告 - 子报告正确绑定)

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

谢谢

2 个答案:

答案 0 :(得分: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));              
    }           
}

答案 1 :(得分:0)

如果我理解正确,你的结构就像一张桌子。那你为什么不拿一个DataTable呢? ReportingServices提供了对这些的轻松访问。 或者我错了吗?