子報表即在一個Report(主報表)中嵌入另一個Report(子報表),從理論上來講,任何一個Report都可以作為一個子報表,但在實際使用過程中,只有主報表和子報表構成一對多關系時才會使用子報表。使用時要注意以下幾點:
1. 使用XRSubreport控件:創建sub-report時,要注意從主報表傳入子報表的參數要與子報表的接收參數一一對應且類型相同;
2. FilterString:對於主子報表間的參數傳遞,主要目的是對sub-report中的記錄進行過濾,主要通過設置ReportTask中的FilterString來完成,對於如何使用FilterString,在此不做贅述;
3. 報表DataSource的代碼設定:在此需要注意的一個問題是,我創建了CalculatedField並使用子報表的接收參數來進行參數的運算,我可以獲取到子報表的接收參數,但對於CalculatedField運算的結果,總顯示為空,后來找到了該問題的解決辦法,主要就是由於沒有設置sub-report的DataSource,導致CalculatedField沒有進行計算,所以顯示為空。以下為設置sub-report DataSource的具體方法:

using (var rptMain = new MainReportName()) { //Set the DataSource to main-report. rptMain.DataSource = (dataprep.GetMainReportDataList()); //Set the DataSource to sub-report. XRSubreport detailReport = rptMain.Bands[BandKind.ReportFooter].FindControl("SubReportName", true) as XRSubreport; detailReport.ReportSource.DataSource = dataprep.GetSubReportDataList(); }