2013-07-18 103 views
1

我有一個包含少量子報告的RDLC報告。我正在使用LocalReport_SubreportProcessing事件處理所有這些子報告。現在,在這些子報告中,一份報告再次有其子報告。我不知道如何處理這個子報告?如何在rdlc中處理子報表的子報表?

對於主報告,我添加了一個事件。

viewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); 
    viewer.LocalReport.Refresh(); 

代碼事件

void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) 
{  
    if (e.ReportPath == "rpt_PSRUserHoursDetail") 
    { 
     //Code 
    } 
    else if (e.ReportPath == "rpt_BEnchMiscDetails") 
    { 

     System.Data.DataTable dtBenchMiscSubReport =DataTable 
     ReportDataSource subRptSource = new ReportDataSource("DataSource", dtBenchMiscSubReport); 
     e.DataSources.Add(subRptSource); 

     (sender as Microsoft.Reporting.WebForms.LocalReport).SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessingBench); 

     CommonHelper.DisposeOf(dtBenchMiscSubReport); 
    } 
} 

代碼來處理子報子報告如下:

void LocalReport_SubreportProcessingBench(object sender, SubreportProcessingEventArgs e) 
{ 
    int intProjectID = 0; 
    int int_UserID = 0; 

    if (e.Parameters.Count > 0 && e.ReportPath=="SubMiscellaneousTaskReport") 
    { 
     //get parameter 

    } 

    DateTime dtCurrentMonth = clsCheckDBNull.ToDate(string.Format("{0}-{1}-{2}", drpYear.SelectedValue, drpMonth.SelectedValue, "01")); 
    if (e.ReportPath == "SubMiscellaneousTaskReport") 
    { 
     System.Data.DataTable dt = DataTable 
     ReportDataSource subRptSource = new ReportDataSource("Dataset1", dt); 
     e.DataSources.Add(subRptSource); 
    } 
} 

回答

0

@chirag Fanse:子報告本身的報告。當你有一個子報告(比如說B)的子報告(比如說A),那麼現在B將成爲你的主要報告,A將成爲子報告。所以你可以檢查子報告,如

if (e.ReportPath == "A") 

其餘的東西都是一樣的。

0

我發現將參數傳遞給子報表報表的方式:

public partial class FormReportViewerAsnDetailed : Form 
{ 
    private readonly int PoID; 

    public FormReportViewerAsnDetailed(int PoID) 
    { 
     this.PoID = PoID; 
     InitializeComponent(); 
     reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", bindingSource1)); 
     reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet2", bindingSource2)); 
     reportViewer1.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing; 
    } 

    private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) 
    { 
     if (e.Parameters.Any(k => k.Name == "AsnID")) //is it asn subreport? 
     { 
      var asn = int.Parse(e.Parameters["AsnID"].Values.First()); 

      asn_Details_ReportTableAdapter1.Fill(viewAsnDetailsDataSet1.Asn_Details_Report, asn); 
      e.DataSources.Add(new ReportDataSource("DataSet2", 
       new BindingSource(viewAsnDetailsDataSet1, "Asn_Details_Report"))); 

      inbound_By_AsnTableAdapter1.Fill(inboundsReportDataSet1.Inbound_By_Asn, asn); 
      e.DataSources.Add(new ReportDataSource("DataSet1", 
       new BindingSource(inboundsReportDataSet1, "Inbound_By_Asn"))); 
     } 
     else // subreport of subreport 
     { 
      inbound_Items_ReportTableAdapter1.Fill(inboundItemsReportDataSet1.Inbound_Items_Report, 
       int.Parse(e.Parameters["InboundID"].Values.First())); 
      BindingSource src = new BindingSource(inboundItemsReportDataSet1, "Inbound_Items_Report"); 
      e.DataSources.Add(new ReportDataSource("DataSet1", src)); 
     } 
    } 

    private void FormReportViewer_Load(object sender, EventArgs e) 
    { 
     this.purchase_Order_Details_ReportTableAdapter1.Fill(
      purchaseOrderDetialsReport1.Purchase_Order_Details_Report, PoID); 
     asn_Select_By_POTableAdapter1.Fill(asnDetailedList1.Asn_Select_By_PO, PoID); 
     reportViewer1.LocalReport.SetParameters(new ReportParameter("po", PoID.ToString())); 
     this.reportViewer1.RefreshReport(); 
    } 
} 

在這裏,我有兩個數據集的主報告。它們在構造函數方法中傳遞,並與主報表參數一起填入加載方法。

在子報表處理中,您需要發現誰是子報表調用:subreport或subreport-of-subreport?然後你需要將數據源傳遞給每一個。