大概注意事項:
1.確定主報表中子報表的名稱與動態載入報表的名稱一樣
2.子報表載入資料的事件在載入子報表流的後面
3.報表要重新Reset並處理過Refresh
4.eg:
void BindReport()
{
//動態create報表
CreatesubRdlc();
ReportViewer1.Reset();
StreamReader mainstream = new StreamReader(Server.MapPath("~/RdlcDoc/" + Request.QueryString["ReportName"].ToString() + ".rdlc"));
ReportViewer1.LocalReport.LoadReportDefinition(mainstream );
mainstream .Close();
StreamReader substream = new StreamReader(Server.MapPath("~/RdlcDoc/" + prerpt + strMenuId + "CommRdlc.rdlc"));
ReportViewer1.LocalReport.LoadSubreportDefinition("CommRdlc", substream);
substream.Close();
//加子報表事件
ReportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubreportProcessingEventHandler);
//開發主報表
ReportViewer1.LocalReport.DataSources.Clear();
//載入主表資料
DataTable dt = ((saveSession)Session["pintQryData"]).dtdata;
ReportDataSource rds1 = new ReportDataSource("ReportDB", dt);
ReportViewer1.LocalReport.DataSources.Add(rds1);
//加參數
ReportParameter[] inpara = ((saveSession)Session["pintQryData"]).rptParam;
ReportViewer1.LocalReport.SetParameters(inpara);
//refresh
ReportViewer1.LocalReport.Refresh();
//刪除臨時產生報表
System.IO.File.Delete(Server.MapPath(prerpt + strMenuId + "CommRdlc.rdlc"));
}
/// <summary>
/// 為子報表加資料來源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
{
DataTable dt = ((saveSession)Session["pintQryData"]).dtdata;
ReportDataSource rds1 = new ReportDataSource("ReportDB", dt);
e.DataSources.Add(rds1);
}