一.寫作前提
前面幾篇中我講了如何去實現一個RDLC報表、插入圖片、參數傳遞及常用表達式的使用。這一節我們將focus on子報表的使用。假設有 一天,你的老板和你說,公司需要做所有員工的出出差記錄,這時子報表的應用是一個不錯的選擇。
關於怎樣創建一個RDLC報表等相關內容,前查看我之前的文章,這裡就不在闡述了。
二.本文內容
1.RDLC報表模板的設計
2.Base的修改
3.調用生成報表
4.總結
三.RDLC報表模板設計
本篇要做的是一個含有子報表的報表,所以,最少我們需要兩個報表模板,一個是Master.rdlc,另外一個是Sub.rdlc。Ok,下面我們 就來啰嗦一下怎麼設計模板文件吧。
1.在VS(本人用的是2008的Version,自從小2003之後都支持.rdlc報表)中創建一個新的web application項目。
2.新增兩個新的報表文件,一個名叫master.rdlc,一個名叫sub.rdlc(在選擇的時候要注意選擇如下)。
3.現在我們已經有報表模板文件了,再創建主報表和子報表所需要使用的數據類型(所需要的DataSet類型,具體可參閱[原創] RDLC 報表系列(一) 創建一個報表),這裡並不多做解釋了。
4.打開 style="mso-bidi-font-weight:bold">master.rdlc文件,從工具箱中拖入一表格控件,設計你所需要的格式,選擇所需要 的數據源類型,然後在你需要使用子報表的地方從工具臬中插入一上SubReport控件,如下圖所示。
5.然後右擊這個SubReport控件,在屬性中選擇這個子報表指向哪個文件,我們可以選擇剛才創建的那個sub.rdlc文件。其次是們還需 要為主報表和子報表之關建立關連關系,在屬性的Parameters(參數)選擇卡中新加我們需要傳遞給子報表的參數。
在我的報表中用 了一個參數如下,當然你也可以根據自己的的需要創建多個你需要傳遞給子報表的參數。
6.上面我們講解完了主報表的設計,他制定了子報表以 及子報表准獲得的參數。現在打開Sub.rdlc文件,增加子報表所需要的數據源類型,並且創建參數,比如說我上面使用了一個isoOid,所 以在子報表中一定有一個參數名稱和這個是相同的,他用來接收從主報表傳來的篩選數據條件,即用這個參數從子報表中選擇符合本記錄 的所有子記錄集。
7.現在從工具箱中插入一個表格到你的子報表中(當然也可以不需要表格,根據需求定義的),然後右擊屬性選 擇所需要的數據源類型,並且根據從Master.rdlc傳過來的參數進行篩選,可以在屬性窗口的Filters(篩選)選項卡中加入篩選條件即可。
8.至此我們講完了報表設計部分,下面我們就去看看,C#中是如何實現的。
四.Base的修改
因為是要用到報表,所以我們需要對子報表的生成事件進行訂閱,因此我們把CustomPageBase寫成如下。
1 public class CustomPageBase : Page
2 {
3 List<ReportDataSource> subDataSource = new List<ReportDataSource>();
4 public void GetReportMultipleDataSourceFile(List<ReportDataSource> reportDateSource, string TemplatePath, List<ReportParameter> parameterList, string FileType, List<string> subDataList)
5 {
6 string reportFormat = FileType;
7 string outputfile = "Report."; //報表名稱
8 ReportViewer rview = new ReportViewer();
9 rview.ProcessingMode = ProcessingMode.Local;
10 rview.LocalReport.ReportPath = Server.MapPath(TemplatePath);
11 rview.LocalReport.DataSources.Clear();
12
13 //為主報表加數據源
14 foreach (ReportDataSource re in reportDateSource)
15 {
16 if (subDataList.Contains(re.Name))
17 {
18 subDataSource.Add(re);
19 continue;
20 }
21 rview.LocalReport.DataSources.Add(re);
22 }
23
24 //設置ReportViewer進行事件訂閱
25 rview.LocalReport.SubreportProcessing +=
26 new SubreportProcessingEventHandler(SubreportProcessingEventHandler);
27
28 if (parameterList.Count > 0)
29 rview.LocalReport.SetParameters (parameterList);
30 string mimeType, encoding, extension, deviceInfo;
31 string[] streamids;
32 Warning[] warnings;
33 deviceInfo = "<DeviceInfo>" + "<SimplePageHeaders>True</SimplePageHeaders>" + "</DeviceInfo>";
34
35 byte[] bytes = rview.LocalReport.Render(reportFormat, deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);
36 HttpContext.Current.Response.Buffer = true;
37 HttpContext.Current.Response.Clear ();
38 HttpContext.Current.Response.ContentType = mimeType;
39 HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + outputfile + extension + ";");
40 HttpContext.Current.Response.BinaryWrite(bytes);
41 HttpContext.Current.Response.End();
42 }
43
44 /// <summary>
45 /// 為子報表加數據源
46 /// </summary>
47 /// <param name="sender"></param>
48 /// <param name="e"></param>
49 void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
50 {
51 foreach (var ReportDataSource in subDataSource)
52 {
53 e.DataSources.Add(ReportDataSource);
54 }
55 }
56 }
和這前的相關,GetReportMultipleDataSourceFile這個文件多提供一了一個新的參數subDataList他是用來指定哪些數據源是給子報表 的。
五.調用生成報表
1 public partial class _Default : CustomPageBase
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5
6 }
7
8 /// <summary>
9 /// Generate the report
10 /// </summary>
11 /// <param name="sender"></param>
12 /// <param name="e"></param>
13 protected void ButtonGenerate_Click(object sender, EventArgs e)
14 {
15 List<ReportDataSource> reportDataSource = new List<ReportDataSource>();
16 List<string> subDataSource = new List<string>();
17 ReportDataSet ds = new ReportDataSet();
18 string templatePath = string.Empty;
19
20 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["PQMSConnectionString"].ConnectionString);
21 SqlCommand comm = conn.CreateCommand();
22 comm.CommandText = "select top 200 Oid, DrawingNumber, CWPNo, PaintCode, MasterRevision from ISO_DRAWING";
23 SqlDataAdapter da = new SqlDataAdapter(comm);
24 da.Fill(ds, "ISO_DRAWING"); //獲得主 表的內容(Get master table data)
25
26 comm.CommandText = "SELECT S.Oid, S.ISOOid, S.SPOOLNo, S.Location, S.IssueNo, S.CP2 FROM SPOOL AS S INNER JOIN (SELECT TOP 200 OID FROM ISO_DRAWING) AS T ON S.ISOOID = T.OID";
27 da = new SqlDataAdapter(comm);
28 da.Fill(ds, "SPOOL");
29
30 reportDataSource.Add(new ReportDataSource ("ReportDataSet_ISO_DRAWING", ds.ISO_DRAWING));
31 reportDataSource.Add(new ReportDataSource("ReportDataSet_SPOOL", ds.SPOOL));
32 subDataSource.Add ("ReportDataSet_SPOOL");
33 List<ReportParameter> parameterList = new List<ReportParameter>();
34
35 templatePath = "Master.rdlc";
36
37 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, "PDF", subDataSource);
38 }
39 }
六.總結
通過上面的學習,我們了解如下內容:
1.Sub Report Design
2.Filter的應用