DevExpress的XtraReport和微軟RDLC報(bào)表的使用和對(duì)比

我們開發(fā)程序的時(shí)候,經(jīng)常會(huì)碰到一些報(bào)表,如果是Winform的報(bào)表,一般可以采用DevExpress控件組的XtraReport,或者微軟的RDLC報(bào)表,當(dāng)然還有一些其他的,在此不再贅述。由于本人在Winform開發(fā)中經(jīng)常使用到一些報(bào)表,有時(shí)候使用XtraReport報(bào)表,有時(shí)候也使用RDLC報(bào)表,因此本篇主要介紹這兩種不同類型報(bào)表的使用,以及對(duì)比它們的差異性,以便我們更好的掌握了解。

1、XtraReport報(bào)表的使用

1)報(bào)表界面展示

在我的派車管理系統(tǒng)里面,我需要根據(jù)數(shù)據(jù)庫(kù)的記錄,把相關(guān)的派車歷史信息做成一個(gè)報(bào)表統(tǒng)計(jì)的模塊,需要列出報(bào)表的明細(xì)(派車明細(xì))和統(tǒng)計(jì)值(記錄數(shù)、公里數(shù)),這種類型的報(bào)表是很多情況下需要碰到的。
我需要實(shí)現(xiàn)一個(gè)基于XtraReport報(bào)表技術(shù)實(shí)現(xiàn)的功能界面,如下面圖示所示。



這里面涉及的字段,包括字符型、日期型,數(shù)值型、枚舉類型等,還有統(tǒng)計(jì)值、打印時(shí)間(參數(shù)),因此也算一個(gè)比較完整的報(bào)表展示了。

2)創(chuàng)建新報(bào)表

為了實(shí)現(xiàn)這個(gè)報(bào)表模塊,我們先使用VS的工具創(chuàng)建一個(gè)報(bào)表組件對(duì)象。


在使用前,我們需要設(shè)置好報(bào)表組件的各個(gè)顯示模塊,報(bào)表報(bào)表上下空間部分(TopMargin/BottomMargin),這兩個(gè)部分用來(lái)調(diào)整上下的邊線的;
然后每個(gè)報(bào)表有頭部?jī)?nèi)容和底部?jī)?nèi)容的區(qū)分,ReportHeader一般用來(lái)放置表格頭部字段顯示的,明細(xì)的內(nèi)容包括展示列表的明細(xì)信息,大致調(diào)整如下所示。



3)設(shè)計(jì)報(bào)表控件和數(shù)據(jù)源管理

在VS左邊的工具箱里面有響應(yīng)的XtraReport控件,拖動(dòng)到報(bào)表界面里面就可以進(jìn)行繪制設(shè)計(jì)了。



為了實(shí)現(xiàn)表格統(tǒng)計(jì)和展示,我們需要拖動(dòng)兩個(gè)表格到報(bào)表界面里面去,一個(gè)是報(bào)表頭字段,一個(gè)用來(lái)顯示報(bào)表明細(xì)的列表內(nèi)容,兩個(gè)單元格的寬度設(shè)置一致,并且上下空間要挨著,否則顯示出來(lái)就有空間,不好看。
表格拖動(dòng)過去后,可以使用右鍵添加相應(yīng)的單元格,然后統(tǒng)一設(shè)置他們的背景顏色,高度寬度,邊框等屬性即可。
表格頭我們可以填寫相關(guān)的文字替代,但是報(bào)表的明細(xì)信息,我們需要綁定相應(yīng)的字段內(nèi)容,因此需要增加一個(gè)數(shù)據(jù)源用來(lái)綁定到報(bào)表上去。
在報(bào)表屬性里面,找到DataSource進(jìn)行配置,如下所示。



拖動(dòng)相關(guān)的表格,然后設(shè)計(jì)其界面,并綁定明細(xì)單元格的內(nèi)容為[ABC]這樣的格式,就標(biāo)識(shí)綁定了一個(gè)ABC的字段屬性了。如下所示是綁定了一個(gè)HandNo的字段顯示。

最終設(shè)計(jì)的報(bào)表界面如下所示。


4)特殊字段的處理

在報(bào)表的設(shè)計(jì)過程中,我們一般會(huì)碰到各種不同的字段,它不是簡(jiǎn)單的文本信息,可能是日期,也可以是統(tǒng)計(jì)值,計(jì)算值等。



打印時(shí)間,只需要增加一個(gè)XRPageInfo,然后設(shè)置里面的值就可以了,這個(gè)有點(diǎn)類似RDLC的參數(shù)值。



從上面我們可以看到有很多項(xiàng)目可以選的,除了有時(shí)間,還有記錄數(shù)、總記錄數(shù)、用戶名、總數(shù)等等。
記錄數(shù)的統(tǒng)計(jì)設(shè)計(jì)如下所示,主要是通過千制的方式顯示,調(diào)用Count函數(shù)處理。

同樣,總公里數(shù),是統(tǒng)計(jì)整個(gè)報(bào)表里面記錄的公里數(shù)操作,調(diào)用SUM函數(shù)處理,它的設(shè)計(jì)界面如下。



設(shè)計(jì)好Xtra報(bào)表后,我們就可以程序里面,直接調(diào)用進(jìn)行加載處理即可,代碼如下所示。
private void PrintReport()
{
    string where = GetConditionSql();
    List<CarApplyInfo> list = BLLFactory<CarApply>.Instance.Find(where);

    FrmHistoryReport report = new FrmHistoryReport();
    report.DataSource = list;

    ReportPrintTool tool = new ReportPrintTool(report);
    tool.ShowPreview();
}

我們主要獲取數(shù)據(jù)源,并綁定數(shù)據(jù)源到對(duì)應(yīng)的報(bào)表組件上,然后調(diào)用ReportPrintTool 進(jìn)行展現(xiàn)即可,代碼非常簡(jiǎn)潔,只是設(shè)計(jì)過程麻煩一些。

2、RDLC報(bào)表的使用

在我《會(huì)員管理系統(tǒng)的設(shè)計(jì)和開發(fā)(2)-- RDLC報(bào)表的設(shè)計(jì)及動(dòng)態(tài)加載》里面,有對(duì)RDLC報(bào)表設(shè)計(jì)做了一些介紹,RDLC是微軟的報(bào)表格式,它是一個(gè)相對(duì)比較獨(dú)立的文件,是一個(gè)基于XML描述性的文件,除了可以用在Winform上外,也可以用在Web上,通用性也非常不錯(cuò)。
基于對(duì)比的考慮,我也為同樣的模塊設(shè)計(jì)了一個(gè)一樣的報(bào)表,RDLC報(bào)表最終展示界面如下所示。


和前面XtraReport的報(bào)表界面做一個(gè)對(duì)比。



兩者的展現(xiàn)效果都差不多,只是界面效果有一些差異而已。
1)RDLC的設(shè)計(jì)效果



由于RDLC它是一個(gè)獨(dú)立的XML文件,它的描述全部在一個(gè)XML里面,因此我們?cè)O(shè)計(jì)的時(shí)候,只是對(duì)XML文件進(jìn)行處理,VS給我們提供了一個(gè)設(shè)計(jì)器及進(jìn)行設(shè)計(jì)而已。
在RDLC的設(shè)計(jì)視圖里面,我們可以看到報(bào)表數(shù)據(jù)里面,包括一些預(yù)定義的數(shù)據(jù),以及我們添加進(jìn)去的數(shù)據(jù)源。

當(dāng)然報(bào)表設(shè)計(jì)少不了相關(guān)的控件,因此在工具欄里面,可以看到可以用的報(bào)表控件元素,如下所示。



2)報(bào)表特殊元素的處理
RDLC報(bào)表,也有一些如打印時(shí)間,分頁(yè)數(shù)據(jù)等,是需要特殊的處理了,打印時(shí)間是使用報(bào)表數(shù)據(jù)里面的【內(nèi)置字段】項(xiàng)目,如下所示。

對(duì)于記錄總數(shù)和統(tǒng)計(jì)值,我們可以通過自定義的格式內(nèi)容進(jìn)行處理,如下所示。

統(tǒng)計(jì)總數(shù)的操作設(shè)計(jì)如下,調(diào)用SUM函數(shù)即可,如果忘記是那個(gè),可以在下面類別里面進(jìn)行查詢,里面有很多運(yùn)算符、常見函數(shù)等內(nèi)容可以使用。

另外,對(duì)于一些特殊的顯示格式,我們需要正確設(shè)置,如下是日期的格式設(shè)置。

3)報(bào)表的調(diào)用處理
由于報(bào)表的展現(xiàn)模塊,我已經(jīng)放到了一個(gè)獨(dú)立的通用模塊里面,因此對(duì)于報(bào)表的加載,只需要簡(jiǎn)單的設(shè)置屬性,然后調(diào)用即可,如下所示。

private void PrintRDLCReport()
{
    string where = GetConditionSql();
    List<CarApplyInfo> list = BLLFactory<CarApply>.Instance.Find(where);
    foreach (CarApplyInfo info in list)
    {
        info.Data1 = info.Status.ToString();//轉(zhuǎn)換枚舉類型描述
    }

    ReportViewerDialog dlg = new ReportViewerDialog();
    dlg.Text = "歷史記錄報(bào)表";
    dlg.DataSourceDict.Add("CarApplyInfo", list);
    dlg.ReportName = "WHC.CarDispatch.HistoryReport";
    dlg.IsPrintLayout = true;

    dlg.ShowDialog();
}

上面主要也是構(gòu)建數(shù)據(jù)源,指定報(bào)表路徑和布局,然后綁定報(bào)表展示模塊窗口即可。
下面附上幾個(gè)系統(tǒng)功能截圖,供參考學(xué)習(xí)。
1)主界面列表,基于GridControl的展示,并增加統(tǒng)計(jì)欄目。



2)歷史記錄報(bào)表展示(XtraReport報(bào)表)



3)兩種不同格式的派車單報(bào)表展示(RDLC報(bào)表)。

3、XtraReport報(bào)表和RDLC報(bào)的差異

這兩者的報(bào)表都能實(shí)現(xiàn)相似的效果,不過XtraReport是把它集成到DLL里面,類似編譯的窗體文件一樣了;而RDLC報(bào)表本身是一個(gè)獨(dú)立的文件,我們發(fā)布的時(shí)候,要把它帶上,但是又有較好的通用性。
對(duì)于XtraReport的字段內(nèi)容展示,默認(rèn)就是調(diào)用了ToString()的函數(shù)處理,因此類似日期、枚舉類型,都不需要怎么樣設(shè)置,就可以正常顯示,但是RDLC報(bào)表設(shè)計(jì)里面,我們需要為每種字段設(shè)置好對(duì)應(yīng)的格式,枚舉類型好像解析還是會(huì)轉(zhuǎn)換為整形,因此需要在數(shù)據(jù)源級(jí)別進(jìn)行轉(zhuǎn)換,否則顯示不出來(lái)。
對(duì)于自定義函數(shù)方面,XtraReport提供了較好的設(shè)計(jì)界面,能夠很大程度減少出錯(cuò)的機(jī)會(huì);RDLC則提供了彈性化的操作,提供了很多函數(shù)進(jìn)行參考,需要自己添加表達(dá)式,不過在編譯的時(shí)候,能夠檢查出現(xiàn)的錯(cuò)誤。
如果需要?jiǎng)討B(tài)配置、加載或者開發(fā)一些新的報(bào)表展示,可能相對(duì)來(lái)說,RDLC更方便,可以增量發(fā)布一些報(bào)表,然后在后臺(tái)配置即可展示,不需要改動(dòng)源碼編譯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容