RDLC之子報表 SubReport
圖1 主子報表示例運行結果
主子報表的數據源顯然也應該是兩個具有主子關系的數據表,本文示例依然使用Northwind數據庫的訂單和訂單明細表作為數據源。
1、在Visual Studio 2005中創建一個Windows應用程序RDLCSR。
2、在項目中添加數據源,數據源並不一定用來為報表提供數據(當然Visual Studio 2005提供的操作非常方便),主要是在報表設計時可以方便向報表中進行字段拖曳。添加數據源意味着在項目中添加了一個數據集Orders.xsd文件,當報表的數據不是來源於關系型數據庫(如Flat Files或Web Services等)時,我們可以自己定義一個xsd文件作為報表設計時的數據源,而在程序中重新為報表載入數據。
3、在項目中添加報表rptOrder.rdlc和rptOrderDetail.rdlc分別作為示例的主報表和子報表。
4、為子報表rptOrderDetail.rdlc添加參數pOrderId,指定其數據類型為Integer,然后如圖2進行子報表的布局設計。
圖2 子報表rptOrderDetail.rdlc布局設計
5、為主報表rptOrder.rdlc進行如圖3所示的布局設計。
圖3 主報表rptOrder.rdlc布局設計
6、在主報表rptOrder.rdlc的子報表控件上單擊右鍵,使用“屬性”菜單調出“子報表屬性”對話框。在“常規”選項卡中的子報表下拉列表中選擇rptOrderDetail;切換到“參數”選項卡,在“參數名稱”列中,系統會自動檢測到步驟4中定義的子報表的參數pOrderId,並在“參數值”列中指定參數值為=Fields!訂單ID.Value。
7、在子報表rptOrderDetail.rdlc中選擇表格控件,使用右鍵菜單“屬性”調出“表屬性”對話框,在“篩選器”選項卡中進行入圖4的設置。這主要是為了在訂單明細中篩選當前訂單的明細數據,當然這一步驟可以在程序中用代碼指定。
圖4 在子報表rptOrderDetail.rdlc中指定篩選器
好了,至此報表布局的設置已經完成了,下面需要在應用程序中顯示報表並給主子報表分別提供數據。
8、在窗體frmMain中添加ReportViewer控件rptMain,並在rptMain的“ReportViewer任務”中選擇報表rptOrder.rdlc。
9、在窗體frmMain中添加圖5所示的代碼:
圖5 窗體frmMain的代碼
可見,必須對ReportViewer控件的LocalReport對象添加SubReportProcessing事件,而該事件主要也就是為了子報表提供數據。
現在就可以運行應用程序查看結果了,如圖6所示。
圖6 示例運行結果(未給列表指定分組)
在圖6中,我們看到出現兩個訂單顯示在同一頁面,而在實際應用中,我們可能希望,每個頁面
上只顯示一條訂單。此時,可以進行以下的設置:
10、在主報表rptOrder.rdlc中,選擇列表控件,右鍵“屬性”彈出“列表屬性”對話框,在“常規”選項卡中,單擊按鈕“編輯詳細信息組”彈出“分組和排序屬性對話框”並進行如圖7所示的設置。