商信互联
本示例演示如何通过处理ReportDataSourceHelper.BeforeShowPreview事件在显示报告内容之前对其进行修改。
移动应用程序不支持报告预览机制,因此本主题中描述的方法无法在移动平台中实现。
在本主题中,假定您有一个使用Reports V2 Module的XAF应用程序,并且已经创建了一个或多个报告(请参阅Reports V2 Module Overview)。
要在显示两个报表之前合并它们,请实现以下帮助程序类,该类处理ReportDataSourceHelper.BeforeShowPreview事件。在这个例子中,从这些网页中SecondReport将被附加到所述的页面FirstReport当FirstReport被预览。
using DevExpress.XtraReports.UI;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.ReportsV2;
// ...
public class MergeReportHelper {
ReportDataSourceHelper helper;
public MergeReportHelper(ModuleList modules) {
ReportsModuleV2 module = ReportsModuleV2.FindReportsModule(modules);
if (module != null) {
module.ReportsDataSourceHelper.BeforeShowPreview =
ReportsDataSourceHelper_BeforeShowPreview;
}
}
private void ReportsDataSourceHelper_BeforeShowPreview(
object sender, BeforeShowPreviewEventArgs e) {
MergeReportsBeforeShow(e.Report, (ReportDataSourceHelper)sender);
}
private void MergeReportsBeforeShow(
XtraReport report, ReportDataSourceHelper reportsDataSourceHelper) {
if (report is FirstReport) {
report.AfterPrint = report_AfterPrint;
helper = reportsDataSourceHelper;
}
}
void report_AfterPrint(object sender, EventArgs e) {
FirstReport firstReport = sender as FirstReport;
SecondReport secondReport = new SecondReport();
helper.SetupReport(secondReport);
secondReport.CreateDocument(false);
firstReport.Pages.AddRange(secondReport.Pages);
firstReport.PrintingSystem.ContinuousPageNumbering = true;
}
}
Imports DevExpress.XtraReports.UI
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.ReportsV2
' ...
Public Class MergeReportHelper
Private helper As ReportDataSourceHelper
Public Sub New(ByVal modules As ModuleList)
Dim [module] As ReportsModuleV2 = ReportsModuleV2.FindReportsModule(modules)
If [module] IsNot Nothing Then
AddHandler [module].ReportsDataSourceHelper.BeforeShowPreview, _
AddressOf ReportsDataSourceHelper_BeforeShowPreview
End If
End Sub
Private Sub ReportsDataSourceHelper_BeforeShowPreview(ByVal sender As Object, _
ByVal e As BeforeShowPreviewEventArgs)
MergeReportsBeforeShow(e.Report, DirectCast(sender, ReportDataSourceHelper))
End Sub
Private Sub MergeReportsBeforeShow(ByVal report As XtraReport, _
ByVal reportsDataSourceHelper As ReportDataSourceHelper)
If TypeOf report Is FirstReport Then
AddHandler report.AfterPrint, AddressOf report_AfterPrint
helper = reportsDataSourceHelper
End If
End Sub
Private Sub report_AfterPrint(ByVal sender As Object, ByVal e As EventArgs)
Dim firstReport As FirstReport = TryCast(sender, FirstReport)
Dim secondReport As New SecondReport()
helper.SetupReport(secondReport)
secondReport.CreateDocument(False)
firstReport.Pages.AddRange(secondReport.Pages)
firstReport.PrintingSystem.ContinuousPageNumbering = True
End Sub
End Class
该ReportDataSourceHelper.SetupReport方法调用需要显示XAF的报告。没有它,数据源将无法提供数据。
应用程序安装完成后,创建MergeReportHelper类的实例。您可以在平台无关的模块中执行此操作,方法是处理重写的ModuleBase.Setup方法中的XafApplication.SetupComplete事件。
public override void Setup(XafApplication application) {
base.Setup(application);
application.SetupComplete = delegate(object sender, EventArgs e) {
new MergeReportHelper(((XafApplication)sender).Modules);
};
}
Public Overrides Sub Setup(ByVal application As XafApplication)
MyBase.Setup(application)
AddHandler application.SetupComplete, Sub(sender As Object, e As EventArgs) _
Dim TempMergeReportHelper As MergeReportHelper = _
New MergeReportHelper(CType(sender, XafApplication).Modules)
End Sub