注意 |
---|
重要说明: .NET Client Profile Framework 不支持此功能。 要在最终用户的机器上使用此功能,则必须安装完整的 .NET Framework。 更多信息,请参阅 Windows 窗体部署 文档中的 关于 .NET Framework 4.0 Client Profile 的重要说明 小节。 |
XtraReports 提供了把报表定义 (带区、控件、数据源和其他设置) 保存到文件、然后从文件中恢复报表实例的的功能。 本文档阐述了如何完成这种任务,并详细说明了使用某些保存方法的潜在限制。 要获得更多信息,请参阅 输出报表。
本文档由下列小节组成。
保存报表的定义
一旦报表类被 构造,就可以把 报表定义 (布局和配置) 保存到硬盘或数据库,例如供后面编辑、预览和打印报表。 报表定义被保存为 REPX 格式,这种格式是 XtraReports 特有的并且包含了使用 CodeDOM 方法生成的 C#-like 信息。
注意 |
---|
报表定义 不 存储任何关于报表 (或任何报表元素) 事件被接管的信息。 因此,为了保持在最终用户设计器中执行的报表事件,应该把这些事件克隆到相应的 脚本事件。 更多信息,请参阅 脚本概述。 |
REPX 文件包含的信息有: 报表类型名称、所有报表属性值、报表带区和控件的所有属性值。 注意, .repx 扩展名不是强制性的,只是用于 XtraReports 中的一个标准扩展名。 例如,在 最终用户设计器 中显示的文件保存和加载对话框中,此扩展名被用作筛选器。
要把报表定义保存为 REPX 文件,则调用 XtraReport.SaveLayout 方法。 注意,此方法有 2 个重载: 把报表保存到 文件 或 流。
C# | 复制代码 |
---|---|
using System.IO; using DevExpress.XtraReports.UI; // ... // Save a report to a file. private string StoreReportToFile(XtraReport report){ string path = "C:\\MyReport.repx"; report.SaveLayout(path); return path; } // Save a report to a stream. private MemoryStream StoreReportToStream(XtraReport report){ MemoryStream stream = new MemoryStream(); report.SaveLayout(stream); return stream; } |
Visual Basic | 复制代码 |
---|---|
Imports System.IO Imports DevExpress.XtraReports.UI ' ... ' Save a report to a file. Private Function StoreReportToFile(ByVal report As XtraReport) As String Dim path As String = "C:\MyReport.repx" report.SaveLayout(path) Return path End Function ' Save a report to a stream. Private Function StoreReportToStream(ByVal report As XtraReport) As MemoryStream Dim stream As New MemoryStream() report.SaveLayout(stream) Return stream End Function |
如果需要以程序方式从 最终用户设计器 保存报表定义,那么可以以两种不同的方式完成此任务:
-
通过调用 XRDesignPanel.SaveReport 方法,静默地 保存报表 (为此,XRDesignPanel.FileName 属性应该有一个有效值,否则,SaveFileDialog 将出现),…
C# 复制代码 // A path to a REPX file. string reportPath = "c:\\Report1.repx"; // Specify the report's path for the design panel. xrDesignPanel1.FileName = reportPath; // Save the report to the specified path. xrDesignPanel1.SaveReport();
Visual Basic 复制代码 ' A path to a REPX file. Dim ReportPath As String = "c:\Report1.repx" ' Specify the report's path for the design panel. XrDesignPanel1.FileName = ReportPath ' Save the report to the specified path. XrDesignPanel1.SaveReport()
-
… 或者,通过人为调用 SaveFileDialog (使用 XRDesignPanel.SaveReportAs 方法)。
加载报表的定义
之前保存 为 REPX 文件或流的报表定义,可以使用下列方法之一被恢复到应用程序中: XtraReport.LoadLayout (2 个重载)、XtraReport.FromFile 或 XtraReport.FromStream。
XtraReport.LoadLayout 方法为已有的 XtraReport 对象加载报表布局,而 XtraReport.FromFile 和 XtraReport.FromStream 是从文件或流创建报表的静态方法。
注意,如果使用后两种方法创建报表,那么应用程序必须能够找到报表的 class 类型 (报表类的类型名称被存储在 REPX 文件头中)。 在下列程序集中检索该类型:
- 在产生 REPX 文件的程序集中 (以 .EXE 或 .DLL 文件表示)。 在 REPX 的文件头中,也记载了它的路径;
- 在调用 FromFile 或 FromStream 方法的当前程序集中;
- 在被当前程序集引用的程序集中。
如果类类型没有被找到,那么创建 XtraReport 类的一个实例,并且把报表布局加载到此实例对象中。
下面的示例代码说明了如何使用这些方法。
C# | 复制代码 |
---|---|
using System.IO; using DevExpress.XtraReports.UI; // ... // Load a report from a file. private void LoadReportFromFile(XtraReport report, string filePath){ if (File.Exists(filePath)) { report.LoadLayout(filePath); } else { Console.WriteLine("The source file does not exist."); } } // Load a report from a stream. private void LoadReportFromStream(XtraReport report, MemoryStream stream){ report.LoadLayout(stream); } // Create a report from a file. private XtraReport CreateReportFromFile(string filePath){ XtraReport report = XtraReport.FromFile(filePath, true); return report; } // Create a report from a stream. private XtraReport CreateReportFromStream(MemoryStream stream){ XtraReport report = XtraReport.FromStream(stream, true); return report; } |
Visual Basic | 复制代码 |
---|---|
Imports System.IO Imports DevExpress.XtraReports.UI ' ... ' Load a report from a file. Private Sub LoadReportFromFile(ByVal report As XtraReport, ByVal filePath As String) If File.Exists(filePath) Then report.LoadLayout(filePath) Else Console.WriteLine("The source file does not exist.") End If End Sub ' Load a report from a stream. Private Sub LoadReportFromStream(ByVal report As XtraReport, ByVal stream As MemoryStream) report.LoadLayout(stream) End Sub ' Create a report from a file. Private Function CreateReportFromFile(ByVal filePath As String) As XtraReport Dim report As New XtraReport() report = XtraReport.FromFile(filePath, True) Return report End Function ' Create a report from a stream. Private Function CreateReportFromStream(ByVal stream As MemoryStream) As XtraReport Dim report As New XtraReport() report = XtraReport.FromStream(stream, True) Return report End Function |
如果需要在 最终用户设计器 中以程序方式加载报表,那么也可以以两种不同的方式完成任务。
- 通过调用 XRDesignPanel.OpenReport 方法,静默地 加载报表 (为此,fileName 参数应该有一个有效值,来避免抛出异常);
- 或者,通过人工调用 System.Windows.Forms.OpenFileDialog (使用 XRDesignPanel.OpenReportFile 方法)。
加载报表的重要说明
注意,如果保存到 REPX 文件中的报表包含了任何 自定义控件、或者被封装在 WinControlContainer 控件中的第三方 Windows 窗体控件,那么从 REPX 文件创建报表的应用程序必须也能够创建这种自定义类型的控件。 应该在创建报表的当前程序集中,或者在被当前程序集引用的程序集中,来声明自定义类型。
但是,在某些情形中,即使已经添加了包含自定义类型的程序集的引用,并且已经和主应用程序文件一起部署,但是也可能发生下列未被处理的异常:
"The type or namespace name 'MyCustomControl' could not be found (are you missing a using directive or an assembly reference?)"
参考译文: “无法找到类型或命名空间名称 'MyCustomControl' (缺少 using 指令或程序集引用?)”
问题是即使把包含自定义控件的程序集添加到项目的“引用”列表中,而程序集却没有被自动加载到应用程序域。 那就是当反序列化 REPX 文件时,自定义类不能被找到的原因。 这是 MS Visual Studio 的有意设计的行为 —— 如果程序没有使用指定程序集中的任何类型,那么就不会把对指定程序集的引用包含到结果程序集中,即使是该程序集已经被包含在项目的引用列表中。
因此,在这种情况下,在打开任何包含了自定义类型引用的 REPX 文件之前,要人工加载该程序集。 同时,只有 没有 引用自定义类型的 REPX 文件可以被 Visual Studio IDE 打开 (使用对报表可用的 导入 命令)。 下列代码演示了在运行时刻如何完成此任务。
C# | 复制代码 |
---|---|
private void button1_Click(object sender, System.EventArgs e) { AppDomain.CurrentDomain.Load(typeof(CustomControNamespacel.MyCustomControl).Assembly.GetName()); XtraReport report = new XtraReport(); report.LoadLayout("layout.repx"); } |
Visual Basic | 复制代码 |
---|---|
Private Sub button1_Click(sender As Object, e As System.EventArgs) _ Handles button1.Click AppDomain.CurrentDomain.Load(GetType(CustomControNamespacel.MyCustomControl).Assembly.GetName()) Dim Report As New XtraReport() Report.LoadLayout("layout.repx") End Sub |
最终用户报表设计器的报表存储
可以把报表定义存储到数据库中、或者任何其他自定义位置。
这可能是有用的,当为最终用户提供使用 最终用户设计器 来创建和定制报表的功能、并且需要有保存和共享所有报表的公共目标时。
要学习如何实现此功能,请参阅下列在线资源。