本文档概述了报表的事件。 描述了主要事件被触发的顺序,并解释了在这些事件中可以执行哪些任务。
在由 XRControl 类公开的公共事件中,下列三个是理解 XtraReports 页面构建概念的关键事件 (以触发顺序相同的次序列出了这些事件)。
注意 |
---|
对于多个控件,BeforePrint 和 AfterPrint 事件被触发的常规顺序是从左到向、从上到下。 但是,并非始终严格保持此序列,因为这取决于报表的复杂度。 要了解报表中事件被触发的严格顺序,请与我们的 支持团队 联系。 |
在上述列出的事件之后,其他特殊事件被触发,在下列章节中简要说明了这些特殊事件。
BeforePrint 事件
在 预览/打印/导出 报表期间,在 XRControl 对象创建其图像之前,XRControl.BeforePrint 事件发生,主要用于以程序方式改变报表的属性、带区的属性、以及存放在 DetailBand 细节带区中的控件的属性。
在此事件中可以执行大部分任务 (例如改变 XRControl.Visible、XRControl.BackColor、XRControl.BorderColor 以及其他属性),可以被轻松执行,而 无需编写代码,只是使用 格式设置规则。 此外,BeforePrint 事件可以被接管,从而重新指派控件的 样式,并且调整其 XRControl.LocationF 属性。
在 BeforePrint 事件中,可以使用 XtraReportBase.GetCurrentColumnValue 方法为数据绑定控件获取数据列的当前值。 注意,在此事件中,修改控件的绑定信息就太迟了。 因此,对于数据绑定控件,可以只调整其静态文本 (例如组成 邮件合并 的部件)。
下列代码演示了 BeforePrint 事件如何工作。
C# | 复制代码 |
---|---|
using System.Drawing.Printing; using DevExpress.XtraReports.UI; // ... 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]; } } |
Visual Basic | 复制代码 |
---|---|
Imports System.Drawing.Printing Imports DevExpress.XtraReports.UI ' ... Private Sub xrLabel1_BeforePrint(ByVal sender As Object, _ ByVal e As PrintEventArgs) Handles xrLabel1.BeforePrint If Convert.ToDouble(Me.GetCurrentColumnValue("UnitPrice")) > 30 Then Dim control As XRControl = Me.FindControl("xrLabel1", True) control.LocationF = New PointF(15F, 15F) control.Styles.Style = Me.StyleSheet(0) End If End Sub |
注意,尽管 BeforePrint 事件并非设计用于为正在生成的控件获取页码,但是在某些场景中也可以完成此任务(通过 Document.PageCount 属性)。 可以在我们的联机代码中心数据库中找到如何这样操作的示例,链接是 如何检测新页面正被创建、并在 BeforePrint 事件处理程序中获取当前页码。 注意,仅当细节带区的 Band.KeepTogether 属性值被设置为 true 时才能正常工作,并且对于复杂报表 (诸如 主/从报表) 可能不会正常工作。 因此,要准确地获取控件的页码,我们推荐使用 PrintOnPage 事件。
注意, 如果 GroupHeaderBand 的 GroupBand.RepeatEveryPage 属性被启用, 那么对于此带区而言,BeforePrint 事件被引发的次数是无法预料的,并且不等于报表中实际的分组数目。 更多信息,请参阅 对数据分组。
AfterPrint 事件
在 XRControl 控件被显示在报表中之后,XRControl.AfterPrint 事件发生,并且主要用于获取控件的 实际 内容( XRControl.Text 属性值,与出现在最终文档中的一样)。 因此,在此事件中,可以获取控件的当前数据行取值和静态文本,例如把该取值传递到另一个窗口中。
下列代码演示了如何执行此操作。
C# | 复制代码 |
---|---|
using System.Windows.Forms; using DevExpress.XtraReports.UI; // ... private void xrLabel1_AfterPrint(object sender, EventArgs e) { MessageBox.Show(this.FindControl("xrLabel1", true).Text.ToString()); } |
Visual Basic | 复制代码 |
---|---|
Imports System.Windows.Forms Imports DevExpress.XtraReports.UI ' ... Private Sub xrLabel3_AfterPrint(ByVal sender As Object, _ ByVal e As EventArgs) Handles xrLabel3.AfterPrint MessageBox.Show(Me.FindControl("xrLabel3", True).Text.ToString()) End Sub |
PrintOnPage 事件
在文档的页面被生成之后,当控件的呈现被打印在页面上时,XRControl.PrintOnPage 事件发生,并且在 BeforePrint 和 AfterPrint 事件之后发生。
当控件已经被打印在特定报表页面上时,使用此事件来执行操作。 这种任务的一个示例是为控件获取当前页码 (相关指南,请参阅 如何: 在打印控件时获取当前页码)。 对于 当前 页号和 总 页数,可以分别通过 PrintOnPageEventArgs.PageIndex 和 PrintOnPageEventArgs.PageCount 属性访问。
使用 PrintOnPage 事件执行任务的另一个示例,是在需要根据 汇总函数 的结果计算复杂函数时。 在这种任务中,在相应的 XRLabel 的 XRLabel.SummaryCalculated 事件处理程序中获取汇总函数的结果,然后在另一个标签的 PrintOnPage 事件处理程序中把结果合计指派到它的 Text 属性。
注意 |
---|
注意,当 PrintOnPage 事件发生的时候,由于报表文档已经被创建,因此在此事件中改变控件的内容将 不会 改变报表的布局 (在最终文档中的位置和大小)。 |
由于 PrintOnPage 允许禁用控件的可视性 (注意在此事件中只把 XRControl.Visible 属性设置为 false 是合法的,反之则不然),此事件也可以用于把空白页插入到文档中。 关于执行此任务的另一种方法,请参阅 如何: 合并两个报表的页面。
在此事件中,仍然可以改变控件的 XRControl.Text 属性值。 但是,改变控件的位置、尺寸、或者获取它的当前数据列取值就太迟了。
其他事件
在上述三个事件 (BeforePrint、AfterPrint 和 PrintOnPage) 完成之后,其他两组事件发生,允许您:
- 处理汇总,通过 XRLabel 的 Summary* 特殊事件 (要获得更多信息,请参阅 计算汇总)。
- XRLabel.SummaryCalculated;
- XRLabel.SummaryGetResult;
- XRLabel.SummaryReset;
- XRLabel.SummaryRowChanged。
- 直接在打印预览时获取控件的内容,通过 XRControl 的 Preview* 特殊事件 (具体示例请参阅 如何: 在预览期间单击标签时获取其文本)。