关于devexpress报表XtraReport,动态修改报表样式(.repx格式),动态添加数据并使用的理解

时间:2022-03-13 04:16:03

一、基本概念:

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

子报表控件,用于显示子报表。

六、报表类型

  1. 静态报表 是简单呈现某些静态信息的报表。 这种报表通常不绑 到数据源,并且在一页上显示单个控件或一组控件。如果需要多次重复相同的报表内容,那么使用 XtraReportBase.DetailPrintCount 属性。
  2. 表格报表 是以表格形式呈现信息的报表。 这些信息被存储在报表的绑定数据源中(也可以运行时从数据库中读取),并且通常此数据源不分层级 (例如,只包含一个数据表)。使用 XRTable 控件,并且绑定表格的单元格来呈现数据源中的数据;
  3. 主从报表如果某个报表被用于显示分层级的数据源中的数据,则通常把它称为 主/从 报表。创建主/从报表的两种主要方法。 第一种方法: 是以使用 从报表带区为基础(使用DetailReportBand带区),当数据源包含主实例和从实例之间的 ADO.NET 关系时,使用这种方法使用。 第二种方法:是创建两个不同的报表类,并且把从报表作为子报表而合并到主报表中(使用XRSubReport控件,指定此控件的ReportSource属性为子报表)。
  4. 多栏报表 是以多个列或行 (取决于当前的多栏设置) 呈现数据的报表。 这种报表是有用的,例如,当每个细节带区都只显示少量数据、并且需要在一列的右侧打印下一个细节带区的外观时,这样就能充分利用整个页面宽度。 此外,当创建有相同内容的 卡片或邮寄地址签、并且需要在许多报表页面上打印大量相同尺寸的卡片时,多栏报表也是有用的。

由于多栏布局主要影响报表的细节带区,因此可以通过 Detail 带区的 DetailBand.MultiColumn 属性来指定多栏模式。 要启用多栏模式,则把 MultiColumn.Mode 属性设置为除去 None 之外的其他取值

栏数固定,栏宽度相同并且被自动计算。
为此,应该把 MultiColumn.Mode 属性设置为 MultiColumnMode.UseColumnCount,并把 MultiColumn.ColumnCount 属性设置为所需的栏数。

自动计算栏数,所有栏的宽度都是相同的固定宽度。
为此,应该把 MultiColumn.Mode 属性设置为 MultiColumnMode.UseColumnWidth,并且把 MultiColumn.ColumnWidth 属性设置为所需的栏宽度。

  1. 交叉表报表 是以交叉表形式呈现信息的报表。 交叉表 (或透视表) 类似于简单的普通 数据绑定表格,但是改为在单个表格中呈现多维的分层级的信息,并含有每行和每列的自动排序、计数、合计和累计。使用XRPivotGrid控件,并为此控件指定数据源、绑定字段到列,同时要保证报表的数据源为NULL,如果两者使用相同的数据源,那么XRPivotGrid控件将被打印与数据源行数相同的次数。
  2. 6.      并列报表在报表中显示两栏相同的或者不同的信息,主要依赖于XRSubReport控件。
  3. 7.      Drill-Through 报表类似于主从报表,但是子报表是通过超链接来访问的。超链接的设置将在下面数据绑定部分介绍。
  4. 8.      邮件合并报表试图创建 e-mail 模板时,经常会遇到困难。 在这些模板中,某些文本是不变的,某些字段 (通常被使用预定义的标记括起来) 应该在创建文档时填充来源于数据库的数据。 此项功能也被称为 邮件合并,并且使用 XtraReports 可以轻松实现。

大体上,要创建嵌入字段,则需要把由 [中括号] 括起的数据字段名称插入到控件的文本中,如果在当前的数据上下文中,字段是有效的,那么当报表被预览或导出时,它将被替换为一个适当的数据值。

  1. 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;
}

不过再此需要将主窗口作为对象传入到报表中

注意:在这里千万要注意,首先要将报表样式添加如:xtpt.LoadLayout(Application.StartupPath + @"\测试.repx");然后进行绑定数据源,不然会出现样式将数据覆盖而无法实现动态添加数据的情况。