2009-09-09 1 views
0

Я работаю с MS Reporting Services. Базовым источником данных являетсяMicrosoft Reporting with Collection как DataSource

IEnumerable<MyObject>, я не использую DataSets.

Каждый MyObject имеет свойства и некоторые другие IEnumerable коллекции. В отчете я хочу отобразить все свойства от MyObject и списков коллекций. Я не знал, как отображать эти внутренние коллекции, поэтому я сделал SubReport, которому я передал MyObject. И так, чтобы 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)); 
    } 
} 

Но в моем основном отчете всегда есть «SubReport не может быть показан». (Главный отчет - подзаголовок правильно скован)

Любая идея почему? Или как решить это более элегантным способом?

Спасибо

ответ

1

OK.

Так что я пошел к этому решению, и это работает:

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 Mapper, и он содержит ForeignKey предметы, иностранные коллекции и т.д. Я бы восстановить это сделать DataTable .. Считаете ли вы, что это хороший подход? –

+0

Честно говоря: я не знаю. Но DataSet/DataTable обычно является хорошим выбором для сопоставления с реляционным источником данных. DataSet предлагает большинство функциональных возможностей, которые делает DataBase, а таблица является базовой структурой реляционного источника данных. Я работал только с таблицей до сих пор, поэтому, я думаю, это также может быть причиной, по которой я буду выбирать их снова. :) – StampedeXV

+0

Я думаю, это зависит от того, насколько сложно получить DataTable по сравнению с исправлением вашей проблемы. – StampedeXV

 Смежные вопросы

  • Нет связанных вопросов^_^