| 在上篇《會員管理系統(tǒng)的設(shè)計和開發(fā)(1)》介紹了關(guān)于會員系統(tǒng)的一些總體設(shè)計思路和要點(diǎn),經(jīng)過一段時間開發(fā),軟件終于完成并發(fā)布。在這期間,碰到了不少技術(shù)難點(diǎn),并積累了不少開發(fā)心得和經(jīng)驗,本篇繼續(xù)介紹這個開發(fā)過程中相關(guān)的技術(shù)要點(diǎn),主要介紹其中RDLC報表的相關(guān)操作,如報表的設(shè)計和通用的動態(tài)加載模塊的處理等內(nèi)容。 什么是RDLC呢,它的全稱是Report Definition Language Client-Side,原來是微軟基于SQL Server 報表服務(wù)中經(jīng)提供了一種被稱為報表定義語言(Report Definition Language, RDL)的改進(jìn)版本,增加了客戶端處理報表功能,在WinForm和WebForm中均可以使用這種報表。 1、RDLC報表的設(shè)計我們知道,RDLC報表展現(xiàn)是基于一個定義的報表文件的,一般是以rdlc后綴名的報表文件,在VS里面新建一個項,選定報表文件即可,如下所示。 
 RDLC的報表設(shè)計界面,提供了很多相關(guān)的控件進(jìn)行繪制。 
 通過這些操作我們可以創(chuàng)建一些報表的元素在里面,如可以增加一些數(shù)據(jù)字段和列表字段在里面,最簡單的報表例子里面,可以增加一些圖片,標(biāo)題,列表等內(nèi)容,如下所示。 
 但往往這個只是測試階段的學(xué)習(xí),一般情況下,我們的報表比上面的規(guī)范很多,要考慮樣式還有布局設(shè)計等方面,下面給出一些我會員系統(tǒng)里面的報表例子供參考對比。 下面是一個會員消費(fèi)清單的報表設(shè)計,包括總的消費(fèi)情況和明細(xì)報表設(shè)計。 
 以及一個會員身份的打印報表設(shè)計。 
 設(shè)計報表完成,只是完成了一部分工作,我們還需要建立數(shù)據(jù)集,把字段綁定到報表上面去,如上面的[Name]這樣標(biāo)識的就是字段已經(jīng)綁定的了,一開始這些可能是沒有的,需要我們先創(chuàng)建數(shù)據(jù)集對象。 
 創(chuàng)建數(shù)據(jù)集對象,可以選擇是DataSet類型的或者是實(shí)體類型的,網(wǎng)上介紹很多是基于DataSet方式的,由于我的Winform框架及整個系列的產(chǎn)品是基于實(shí)體類的,因此我的報表創(chuàng)建的數(shù)據(jù)集對象也是基于實(shí)體對象的。 從上面可以看出,創(chuàng)建的數(shù)據(jù)集對象,是引用我的實(shí)體類對象,里面包含了很多對象屬性,非常容易理解。 創(chuàng)建了相應(yīng)的數(shù)據(jù)集對象后,我們進(jìn)一步就是把這些信息綁定到設(shè)計的報表上面了。 先在報表視圖里面,把列表對象選中,綁定它的數(shù)據(jù)集對象,操作如下面兩個圖所示。 
 
 這樣我們就可以隨意指定列表里面的列的字段綁定操作了。 
 
 2、RDLC報表的動態(tài)加載通過第一節(jié)介紹的報表設(shè)計和數(shù)據(jù)集對象的創(chuàng)建,然后進(jìn)行綁定操作后,基本上設(shè)計部分就已經(jīng)完成了,注意的就是調(diào)整好對應(yīng)的格式,加載測試后進(jìn)行微調(diào)整即可了。 本小節(jié)繼續(xù)介紹,如何把數(shù)據(jù)進(jìn)行動態(tài)加載進(jìn)行綁定。 為了實(shí)現(xiàn)報表的預(yù)覽,我們需要在UI項目里面添加下面兩個程序集對象。 
 然后在一個預(yù)覽報表的窗體里面,放置一個報表查看控件ReportViewer,設(shè)計報表預(yù)覽界面窗體如下所示。 
 以后我們設(shè)計的報表,就準(zhǔn)備通過這個界面進(jìn)行展現(xiàn)的了。 通過ReportViewer我們可以獲得LocalReport對象的引用,然后對它進(jìn)行處理即可。 LocalReport report = this.rpViewer.LocalReport;報表的數(shù)據(jù)綁定,主要就是增加報表對象里面的對應(yīng)的ReportDataSource對象即可。 通過報表對象LocalReport,我們可以使用代碼增加對應(yīng)的數(shù)據(jù)源給它的報表對象,這樣我們需要展現(xiàn)的報表數(shù)據(jù)源就可以和報表進(jìn)行綁定了,具體的處理代碼如下所示。 
 那么我們?nèi)绾卧诮缑娲绑w里面進(jìn)行報表的綁定操作呢? 封裝好通用的報表展現(xiàn)界面后,我們只需要調(diào)用他們的接口進(jìn)行綁定一個新的報表和數(shù)據(jù)源了。具體代碼如下所示。 private void menuPrintReport_Click(object sender, EventArgs e) { string headerID = this.winGridViewPager1.gridView1.GetFocusedRowCellDisplayText("ID"); if (!string.IsNullOrEmpty(headerID)) { MemberConsumptionInfo consumptionInfo = BLLFactory<MemberConsumption>.Instance.FindByID(headerID); if (consumptionInfo != null) { //修改一些屬性值 //會員姓名 consumptionInfo.Data1 = BLLFactory<Member.BLL.Member>.Instance.GetNameByID(consumptionInfo.Member_ID); consumptionInfo.Data2 = SecurityHelper.GetFullNameByID(consumptionInfo.Creator); List<MemberConsumptionInfo> list = new List<MemberConsumptionInfo>(); list.Add(consumptionInfo); List<ConsumptionDetailInfo> detailList = BLLFactory<ConsumptionDetail>.Instance.FindByBillNo(consumptionInfo.BillNo); foreach (ConsumptionDetailInfo info in detailList) { //修改ProductID為商品編碼 info.Product_ID = BLLFactory<MemberProduct>.Instance.GetHandNoByID(info.Product_ID); } ReportViewerDialog dlg = new ReportViewerDialog(); dlg.DataSourceDict.Add("MemberConsumptionInfo", list); dlg.DataSourceDict.Add("ConsumptionDetailInfo", detailList); dlg.ReportName = "WHC.Member.ConsumptionReport"; AppConfig config = new AppConfig(); string companyName = config.AppConfigGet("CertificatedCompany"); dlg.Parameters.Add("CompanyName", companyName); dlg.ShowDialog(); } } } 3、RDLC報表的展現(xiàn)效果在上面兩個小節(jié)里面,我們已經(jīng)介紹過RDLC報表如何設(shè)計、如何綁定到ReportViewer報表預(yù)覽界面上了,還有也說明了如何在主窗體里面使用數(shù)據(jù)源進(jìn)行動態(tài)的加載操作,但到底具體的報表展現(xiàn)效果如何呢,下面我給出幾個案例作為參考。 1)消費(fèi)清單報表 
 2)收費(fèi)記錄報表 
 3)會員卡片打印報表 
 
 | 
|  |