XtraReport
一、基本概念:
XtraReports 中的每個報表都由 XtraRepot 類的一個實例表示,或者由該類的子類來表示(這種情況更常見)。 因此,每個報表都作為帶區的容器使用,而每個帶區中都包含報表控件。XtraReports 中的每個報表都可以被綁定到數據,或者不綁定。 要創建綁定報表,則首先要把報表綁定到數據源,然后指定每個報表控件的數據綁定選項。報表控件、帶區 和報表自身的所有大小和位置,都以報表內相同的單位度量。 度量單位由報表的 XtraReport.ReportUnit 屬性指定,可以設置為下列類型之一:百分之一英寸:當 ReportUnit 屬性值被設置為 ReportUnit.HundredthsOfAnInch 時使用。 十分之一毫米:當 ReportUnit 屬性值被設置為 ReportUnit.TenthsOfAMillimeter 時使用。
二、頁面構建時用到的事件
Before Print:
在 預覽/打印/導出 報表期間,在 XRControl 對象創建其圖像之前,XRControl.BeforePrint 事件發生,主要用於以程序方式改變報表的屬性、帶區的屬性、以及存放在 DetailBand 細節帶區中的控件的屬性。
在此事件中可以執行大部分任務 (例如改變 XRControl.Visible、XRControl.BackColor、XRControl.BorderColor 以及其他屬性),可以被輕松執行,而 無需編寫代碼,只是使用 格式設置規則。 此外,BeforePrint 事件可以被接管,從而重新指派控件的樣式,並且調整其 XRControl.LocationF 屬性。
在 BeforePrint 事件中,可以使用 XtraReportBase.GetCurrentColumnValue 方法為數據綁定控件獲取數據列的當前值。 注意,在此事件中,修改控件的綁定信息就太遲了。 因此,對於數據綁定控件,可以只調整其靜態文本。
示例代碼:
private void xrLabel1_BeforePrint(object sender, PrintEventArgs e)
{
if (Convert.ToDouble(this.GetCurrentColumnValue("UnitPrice")) > 30) {
XRControl control = this.FindControl("xrLabel1", true);
control.LocationF = new PointF(15F, 15F);
control.Styles.Style = this.StyleSheet[0];
}
}
三、報表結構
整個報表是由多個綁定帶區組成,綁定帶區如下:
綁定帶區 |
說明 |
TopMarginBand |
每個頁面上面都顯示的空白(天頭),在PageHeaderBand或者ReportHeaderBand上面 |
ReportHeaderBand |
在報表起始位置(報表頭), 此帶區被設計用於顯示某些概述信息,例如報表的封面。 |
PageHeaderBand |
在每個頁面的上方(頁眉),在TopMarginBand或者ReportHeaderBand下方 |
GroupHeaderBand |
在每組的起始位置,或者在分跨多個頁時而位於組的上方(分組標頭)。 此帶區指定分組標准,並被用於顯示每組記錄起始位置的信息 |
DetailBand |
在頁面上所有其他帶區之間(細節)。 此帶區每行只顯示綁定數據源中的一條記錄,或者當沒有為報表指定數據源時而簡單地持有非綁定控件。 |
DetailReportBand |
在DetailBand的下方(從表),被設計用於在創建主/從報表時持有從報表 |
GroupFooterBand |
在每組的結束位置,或者在分跨多個頁時而位於組的下方(分組腳注)。 此帶區主要被設計用於顯示每組的總結信息。 |
ReportFooterBand |
在報表結束位置(報表腳注)。 此帶區被設計用於顯示某些終極信息,例如報表總結。 |
PageFooterBand |
在每個頁面的下方(頁腳)在ReportFooterBand下方和BottomFooterBand上方,此帶區被設計用於從之前頁面接續的頁碼或表尾 |
BottomMarginBand |
每個頁面底部的空白(地腳),在PageFooterBand的下方。 |
四、報表常用屬性
屬性 |
說明 |
BackColor |
設置報表控件的背景色 |
Bands |
報表包含的帶區,用於放置各種控件(集合) |
BorderColor |
報表中控件邊框顏色 |
BorderDashStyle |
報表中控件邊框樣式 |
Borders |
報表中控件邊框 |
BorderWidth |
邊框寬度 |
CalculatedFiled |
計算字段,主要被用於 data-aware(數據感知) 報表中(集合) |
DataAdapter |
數據源Adapter對象 |
DataMember |
數據源中用於綁定報表的具體表 |
DataSource |
報表數據源 |
DataSourceSchema |
指定數據源框架文件(XML/XSD文件) |
DesignerOptions |
ShowDesignerHints(bool):設計時顯示提示 ShowDesignerWarnings(bool):設計時顯示警告提示 ShowPrintingWarnings(bool):打印提示 |
DetailPrintCount |
設置打印的頁數 |
DetailPrintCountOnEmptyDataSource |
當數據源為空時打印的次數 |
DrawGrid(bool) |
設置是否要繪制對齊網格 |
ExportOptions |
用於設置報表導出時的相關屬性(集合) |
FilterString |
報表數據過濾字符串 |
PageColor |
報表頁面顏色 |
FormattingRules |
設置格式化樣式 |
FormattingSheet |
格式化樣式集合 |
PagerKind |
設置紙張類型 |
Parameters |
設置報表參數 |
PrintOnEmptyDatasource(bool) |
設置當數據源為空時是否打印 |
RequestParameters(bool) |
設置是否在參數Submit后再創建報表 |
SnapGridSize |
設置報表對齊網格大小 |
SnappingModel |
設置對齊模式(SnapToLines&SnapToGrid) |
SnapToGrid(bool) |
設置是否對齊到網格 |
StyleSheet |
設置控件引用的樣式 |
StyleSheetPath |
設置引用外部樣式文件 |
TextAlignment |
設置報表字體對齊方式 |
Watermark |
(屬性集合)用於設置報表的水印,包括圖片和文字 |
XmlDataPath |
設置數據源為Xml文件的數據源路徑 |
五、報表控件
報表控件在Web應用程序中分為Web頁面控件和報表設計控件
1.Web頁面控件
控件 |
說明 |
ReportDocumentMap |
用於在Web頁面顯示報表中的書簽,需要指定該控件的ReportViewer屬性。 |
ReportParameterPanel |
用於Web頁面傳遞參數給報表,需要指定該控件的ReportViewer屬性。 |
ReportViewer |
用於Web頁面呈現報表,需指定該控件的Report屬性為要顯示的報表實例。 |
ReportToolbar |
與ReportViewer控件配合使用,實現翻頁,打印,導出等功能。 |
2.報表設計時控件:
控件 |
說明 |
XRLabel |
標簽控件,允許把單行或多行文本插入到報表中。此文本可能是靜態的,也可能是動態綁定。 |
XRCheckBox |
復選框控件,被設計用於在報表中顯示 True/False 或 選中/未選中/不確定 狀態。 |
XRRichText |
富文本控件,被設計用於顯示、輸入和操作設置格式的文本。 |
XRPictureBox |
圖片框控件,用於顯示報表中的圖像。 |
XRPanel |
面板控件,可以包含其他報表控件。 |
XRTable |
表格控件,用於插入表格 (包括行和單元格)。 |
XRLine |
線條控件,用於在報表中繪制垂直線、水平線或斜線。 |
XRShape |
形狀控件,用於把簡單的圖形嵌入到報表中。 |
XRBarCode |
條形碼控件,允許把許多不同的條形碼類型插入到報表中。 |
XRZipCode |
郵政編碼控件,允許把表示郵政編碼的數字插入到報表中。 |
XRChart |
圖表控件,可以用於以圖形視圖呈現數據。 |
XRPivotGrid |
透視網格控件,用於以交叉表的形式呈現下層數據源中的數據,從而創建交叉表報表。 |
XRPageInfo |
顯示某些輔助信息的控件。 使用此控件可以在報表中顯示頁碼、當前日期或用戶信息。 |
XRPageBreak |
分頁符控件,用作標記報表應開始新頁面。 |
XRCrossBandLine |
可以跨多個帶區的線條控件。 |
XRCrossBandBox |
可以跨多個帶區的方框控件。 |
XRSubReport |
子報表控件,用於顯示子報表。 |
六、報表類型
- 靜態報表 是簡單呈現某些靜態信息的報表。 這種報表通常不綁 到數據源,並且在一頁上顯示單個控件或一組控件。如果需要多次重復相同的報表內容,那么使用 XtraReportBase.DetailPrintCount 屬性。
- 表格報表 是以表格形式呈現信息的報表。 這些信息被存儲在報表的綁定數據源中(也可以運行時從數據庫中讀取),並且通常此數據源不分層級 (例如,只包含一個數據表)。使用 XRTable 控件,並且綁定表格的單元格來呈現數據源中的數據;
- 主從報表如果某個報表被用於顯示分層級的數據源中的數據,則通常把它稱為 主/從 報表。創建主/從報表的兩種主要方法。 第一種方法: 是以使用 從報表帶區為基礎(使用DetailReportBand帶區),當數據源包含主實例和從實例之間的 ADO.NET 關系時,使用這種方法使用。 第二種方法:是創建兩個不同的報表類,並且把從報表作為子報表而合並到主報表中(使用XRSubReport控件,指定此控件的ReportSource屬性為子報表)。
- 多欄報表 是以多個列或行 (取決於當前的多欄設置) 呈現數據的報表。 這種報表是有用的,例如,當每個細節帶區都只顯示少量數據、並且需要在一列的右側打印下一個細節帶區的外觀時,這樣就能充分利用整個頁面寬度。 此外,當創建有相同內容的 卡片或郵寄地址簽、並且需要在許多報表頁面上打印大量相同尺寸的卡片時,多欄報表也是有用的。
由於多欄布局主要影響報表的細節帶區,因此可以通過 Detail 帶區的 DetailBand.MultiColumn 屬性來指定多欄模式。 要啟用多欄模式,則把 MultiColumn.Mode 屬性設置為除去 None 之外的其他取值
欄數固定,欄寬度相同並且被自動計算。
為此,應該把 MultiColumn.Mode 屬性設置為 MultiColumnMode.UseColumnCount,並把 MultiColumn.ColumnCount 屬性設置為所需的欄數。
自動計算欄數,所有欄的寬度都是相同的固定寬度。
為此,應該把 MultiColumn.Mode 屬性設置為 MultiColumnMode.UseColumnWidth,並且把 MultiColumn.ColumnWidth 屬性設置為所需的欄寬度。
- 交叉表報表 是以交叉表形式呈現信息的報表。 交叉表 (或透視表) 類似於簡單的普通 數據綁定表格,但是改為在單個表格中呈現多維的分層級的信息,並含有每行和每列的自動排序、計數、合計和累計。使用XRPivotGrid控件,並為此控件指定數據源、綁定字段到列,同時要保證報表的數據源為NULL,如果兩者使用相同的數據源,那么XRPivotGrid控件將被打印與數據源行數相同的次數。
- 6. 並列報表在報表中顯示兩欄相同的或者不同的信息,主要依賴於XRSubReport控件。
- 7. Drill-Through 報表類似於主從報表,但是子報表是通過超鏈接來訪問的。超鏈接的設置將在下面數據綁定部分介紹。
- 8. 郵件合並報表試圖創建 e-mail 模板時,經常會遇到困難。 在這些模板中,某些文本是不變的,某些字段 (通常被使用預定義的標記括起來) 應該在創建文檔時填充來源於數據庫的數據。 此項功能也被稱為 郵件合並,並且使用 XtraReports 可以輕松實現。
大體上,要創建嵌入字段,則需要把由 [中括號] 括起的數據字段名稱插入到控件的文本中,如果在當前的數據上下文中,字段是有效的,那么當報表被預覽或導出時,它將被替換為一個適當的數據值。
- 9. 標簽報表此報表與多欄報表相類似。
七、報表數據源
1.數據源
通過 XtraReport 對象的 XtraReportBase.DataSource 屬性把它綁定到數據源,而與特定的數據源類型和所使用的數據綁定方法無關。 唯一的例外是當使用 XML 數據源時,需要指派到 XtraReportBase.XmlDataPath 屬性,同時要求把 XtraReportBase.DataSource 屬性設置為 null。
2.綁定數據的方法
2.1.使用 .NET 數據提供程序綁定報表
這種方法意味着數據被存儲在數據庫中。 使用已提供的兩種數據適配器組件之一,就可以把報表綁定到這種數據:
OleDbDataAdapter,使用 OLE DB 訪問公開的數據源;
SqlDataAdapter,被設計用於使用由 Microsoft SQL Server 7.0 或后續版本提供的數據源。
這些數據適配器都使用連接對象來綁定數據,並且能夠生成包含數據表的 DataSet 對象。 然后通過把數據表 (或綁定到表的數據視圖) 直接指派到 XtraReportBase.DataSource 屬性,它們就可以被綁定報表。 也可以把生成的 DataSet 對象指派到 XtraReportBase.DataSource 屬性,並且使用 XtraReportBase.DataAdapter 屬性來指定數據適配器的名稱。
2.2.把報表綁定到 List
在運行時刻創建的數據對象必須支持 IList、ITypedList 或 IBindingList 接口,並且被指派到 XtraReportBase.DataSource 屬性。 注意,你不需要創建自定義的數據源對象。 例如,可以在運行時刻使用填充了數據的 DataTable 對象。
2.3.把報表綁定到 XML 數據
這種方法使用存儲在 XML 文件中的數據。 可以以兩種方式之一來訪問這種數據。把 XtraReportBase.DataSource 屬性值設置為根據 XML 文件創建的數據集; 直接把 XML 文件指派到 XtraReportBase.XmlDataPath 屬性。
八、數據綁定與報表預覽
1.設計時綁定
在設計時綁定數據源,需要把相應的數據源添加到應用程序中,即在應用程序中添加DataSet程序集,然后在報表設計界面,把報表的數據源指定到相應的數據集上,打開Field List字段列表,將相應的字段用鼠標拖到相應的控件上即可。點擊Preview 即可預覽報表。
2.運行時綁定
在運行時綁定數據源,更具靈活性,它可以根據需要從數據庫中讀取有用的數據來呈現在報表上。對於運行時綁定數據源,其數據綁定操作要在報表的構造函數中完成。在報表設計器中只需把相應的控件放置好即可。報表控件中都有一個DataBindings屬性,此屬性的Add方法可以把數據綁定到控件上。
示例代碼:
Void DataBind()
{
DataSource=tb // tb為DataTable
xrLabel1.DataBinds.Add(”Text”,null,”Column1”);
xrLabel2.DataBinds.Add(”Text”,null,”Column2”,”FormatString:{0}”);
}
在報表的構造函數中調用以上方法就可以將數據綁定到xrLabel上,其中Add方法有兩個重載:
Control.DataBinds.Add(控件屬性,數據源,綁定字段)
Control.DataBinds.Add(控件屬性,數據源,綁定字段,格式化設置)
每個控件可綁定的屬性可能有所不同,可以通過該控件的DataBinds屬性來查看。
3.Chart控件綁定
Chart控件與PivotGrid控件都需要獨立指定數據源,同時,如果這兩個控件被放置Detail帶區中,報表不能指定數據源,不然,該控件將被顯示與報表數據源行數相同的次數。
對與Chart控件的數據綁定,要把相應字段綁定到對應的Series上,ArgumentDataMember為X軸綁定字段,ValueDataMembersSerializable為Y軸字段。
一個圖表中可以有多個Series,可以通過Series索引或者Name來找到相應的Series.Chart控件中Series集合表示圖表,Titles集合是對應Series的標題。
示例代碼:
protected void DataBind()
{
string sqlStr = "select UnitPrice,ProductName from ProductSales group by ProductName,UnitPrice";
this.xrChart1.DataSource = helper.getDataTable(sqlStr);
this.xrChart1.Series[0].ArgumentDataMember = "ProductName";
this.xrChart1.Series[0].ValueDataMembersSerializable = "UnitPrice";
this.xrChart1.Series[0].Name = "Price";
this.xrChart1.Series[0].LegendPointOptions.PointView = PointView.Argument;
his.xrChart1.Legend.Visible = false;
}
九、數據呈現
由於數據源提供方式分為設計時與運行時,所以數據呈現也有所不同。對於運行時提供數據源的報表,分組、排序都需要通過代碼添加到報表中,而設計時提供數據源則可以直接通過圖形化界面進行設置。
1.數據分組與排序
運行時分組需要在數據綁定函數中加入如下代碼:
this.GroupHeader1.GroupFields.Add(new GroupField("StudentID",XRColumnSortOrder.Descending));
GroupField的兩個參數分別為分組字段,排序方式。
2.數據篩選
2.1.在報表級篩選
在報表中添加Parameters屬性中添加篩選參數,並設置篩選條件,在Web頁面上Parameters中的參數列表將被顯示在ReportParameterPanel控件中,報表中添加參數以后,默認狀態預覽報表需要點擊Submit后報表才被創建,若要不提供參數也創建報表,需要將報表的RequestParameters屬性設置為false。
2.2.在數據源級篩選
在數據級篩選數據,主要是通過SQL語句的where條件,要將Where條件的參數傳遞到報表類中,可以通過報表的構造函數,其他方式有待研究。同時結合在報表級的數據篩選,可以方便點的在頁面上呈現出需要的數據。
3.數據格式化
通過控件的FormatString屬性可以根據需要設置相應的格式化輸出樣式。通過控件的Summary屬性來設置各種統計功能。
十、外觀設置
1.外觀屬性
外觀屬性如下表:
屬性 |
說明 |
BackColor |
獲取或設置報表元素及其子控件的背景色 |
BorderColor |
獲取或設置報表元素及其子控件的邊框色。 |
BorderDashStyle |
獲取或設置報表元素及其子控件的邊框虛線樣式。 |
Borders |
獲取或設置報表元素及其子控件的可視邊框 (上、右、下、左)。 |
BorderWidth |
獲取或設置報表元素及其子控件的邊框寬度。 |
Font |
獲取或設置報表元素及其子控件的字體選項 (字體名稱、大小等)。 |
ForeColor |
獲取或設置報表元素及其子控件的前景色。 |
Padding |
獲取或設置用於繪制報表元素及其子控件內容的縮進量。 |
TextAlignment |
獲取或設置報表元素及其子控件的文本對齊方式。 |
2.樣式
2.1奇偶行樣式
它允許在視覺上把報表中連續的數據字段划分開,從而有更好的可讀性。 要把這些樣式應用於控件,則應該使用其 XRControl.OddStyleName 和 XRControl.EvenStyleName 屬性。
2.2.樣式表
在設計時刻可以使用 Styles Editor(樣式編輯器) 來管理報表的樣式表、定制樣式表、存儲到文件以及從文件中加載。 因此,可以創建多個樣式表,並且在設計時刻或運行時刻加載。保存報表的樣式表的方式有兩種。 第一種方式是保存為外部文件 (有 REPSS 擴展名),然后使用 XtraReport.StyleSheetPath 屬性,以只讀模式加載到報表 (這種方式在 如何: 創建和存儲報表樣式表 主題中進行了描述)。 第二種方式是把樣式表存儲在報表內 (使用 XtraReport.StyleSheet 屬性),因此可以按照需要進行修改,並和報表本身一起被保存。
3.附條件格式設置
通過控件的FormattingRuls屬性設置格式化規則,當滿足該規則時,將以定義的樣式顯示該行數據。同一個報表的FormattingRules被放置在FormattingRulesSheet屬性中。
十一、交互導航
1.超鏈接
示例代碼:
為xrLabel添加超鏈接
xrLabel.DataBinds.Add(“NavigateUrl”,null,”Colunm”,”http://www.quantacn.com?id={0}”);
解釋:在報表已指定數據源的情況下(設計時或者運行時)可以用以上方法對控件綁定NavigateUrl屬性,同時格式化Url地址與要穿的的參數。
2.文檔地圖
在報表中若設置了Bookmark屬性,報表將生成文檔地圖,在Web頁面中用ReportDocumentMap控件來顯示。
示例代碼:
為xrPanel添加文檔地圖
xrPanel.DataBinds.Add(“Bookmark”,null,”Column”,”FormatString:{0}”);
十二、其他
不使用ReportToolBar來打印,導出報表。
步驟:
1.在web頁面設置ReportViewer控件的ClientInstanceName屬性(例如:viewer)
2.添加ASPxButton控件到web頁面
3.點擊ASPxButton控件的智能標簽,取消AutoPostBack,點擊Client-Side-Events;
4.在Click事件中添加如下代碼
function(s, e) {
viewer.SaveToDisk(‘PDF’); //保存為PDF格式
viewer.Print(); //打印報表
}
十三、應用程序部署
Web應用程序發布之后,所應用的DevExpress中的dll文件不會被生成到應用程序下得Bin文件夾中,所以必須手動到Developer Express安裝目錄先的Source文件夾中把應用程序中所引用的dll文件拷到應用程序中的Bin文件夾中,然后再把應用程序部署到服務器上。否則,報表將不能正常顯示,還要注意一點,在設計報表時,不要指定打印機的類型,以免打印時出錯(網上有人遇到過此問題)。在本機將應用程序部署到IIS上,測試正常。