前兩天,有網友在Blog上評論要求將子報表的配置貼出來,由於這兩天有些別的事情,所以耽擱了;另外,自己也比較懶,有些東西明明應該早就寫出來的。呵呵,說聲“對不起”,然後還有“謝謝你”!
OK,這篇隨筆就講一下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所示的設定。
圖7 為列表指定分組並設定分頁顯示選項
事實上,主子報表和鑽研報表有著相似的地方,所以如果看了這篇隨筆有什麼不明白的地方,可以參看一下我的另一篇隨筆RDLC Report Step by Step 1: DrillThrough Report。
Demo下載