2009-09-09 5 views
0

보고 서비스과 협력하고 있습니다. 기본 데이터 소스는Microsoft Reporting with DataSource로

IEnumerable<MyObject>입니다. 데이터 세트를 사용하고 있지 않습니다.

모든 MyObject에는 속성 및 일부 다른 IEnumerable 컬렉션이 있습니다. 보고서에서 나는 모든 속성을 MyObject과 에서 표시하고 싶습니다. 이 내부 컬렉션을 표시하는 방법을 알지 못했기 때문에 서브 보고서MyObject .Id를 전달하여 SubReport가 직접 개체를 검색하고 이러한 내부 컬렉션에 대한 DataSource를 빌드 할 수 있도록했습니다. 이 이벤트에서이 작업을 수행합니다.

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

그러나 마스터 보고서에는 항상 "The SubReport"가 표시되지 않았습니다. (마스터 보고서 - 하위 보고서가 올바르게 바인딩 됨)

어떤 아이디어가 있습니까? 아니면 이것을 좀 더 우아한 방법으로 해결할 수 있을까요?

감사합니다.

답변

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

이 컬렉션은 ObjectRelational 매퍼에서 검색, 그리고 외래 키 객체, 나는 그것이 DataTable을을 다시해야 할 것 해외 컬렉션 등을 포함 .. 그게 좋은 접근 방법이라고 생각하니? –

+0

정직하게 : 모르겠다. 그러나 DataSet/DataTable은 일반적으로 관계형 데이터 소스에서 매핑하는 것이 좋습니다. DataSet은 DataBase에서 수행하는 대부분의 기능을 제공하며 테이블은 관계형 데이터 소스의 기본 구조입니다. 나는 지금까지 테이블과 만 일했기 때문에 그것이 내가 다시 그들을 선택할 이유가 될 수 있다고 생각합니다. :) – StampedeXV

+0

나는 당신의 문제를 고치는 것과 비교하여 DataTable을 검색하는 것이 얼마나 어려운지에 달려 있다고 생각합니다. – StampedeXV

관련 문제