一、基本概念:
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(); //打印报表
}
十三、动态修改报表样式:
1.在初始报表中保存修改后的.repx文件并保存在某一个目录下
2.通过创建对象添加新的报表样式得到报表
报表.XtraReport1 xtpt = new 报表.XtraReport1(this);
xtpt.LoadLayout(Application.StartupPath + @"\测试.repx");
xtpt.SetDataBind(); //自己写函数绑定数据源
xtpt.ShowPreview();
3.对数据源的绑定有三种
(1)可重构构造函数,将主窗口对象传入,然后具体值进行对应,此不需要绑定数据源
public XtraReport1(Form1 form1)
{
//代码
}
(2)通过构造函数绑定数据源
public XtraReport1(Dateset s)
{
//代码
}
(3) 通过直接调用函数进行值的传入
public void SetDataBind()
{
xrTableCell6.Text = this.thisForm.wd.Text;
}
不过再此需要将主窗口作为对象传入到报表中