2009-09-09 60 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