应该使用嵌入式报表还是非嵌入式报表?

如果计划使用 Crystal Reports SDK 构建应用程序,需要考虑的最重要的问题之一就是应该使用嵌入式报表,还是非嵌入式报表。通过学习有关报表嵌入的 SDK 基础知识,将有助于为 Crystal Reports for Visual Studio 项目选择最佳结构。

嵌入式报表和非嵌入式报表之间有什么区别?

嵌入式报表是已经导入到 Visual Studio 项目中或在其中创建的报表。在报表嵌入到项目中后,会自动为该报表生成一个包装类。

非嵌入式报表是位于 Visual Studio 项目外部的报表。可以使用许多种方法来访问此报表,并将其加载到对象模型中(以允许通过编程方式与报表进行交互),但是此报表始终保留在项目的外部。

嵌入式报表如何工作?

把报表导入到项目中或在项目中创建了报表后,将会创建一个包装类(名称与报表相同)。这个包装类在项目中包装(也可称作表示)该报表。之后,项目中的所有代码均与创建用于表示该报表的报表类进行交互,而不是与原始报表文件本身进行交互。

编译项目时,报表和其包装类均会被嵌入到程序集中,与任何其它项目资源一样。

报表包装类继承自通用基类 ReportDocument。它继承了 ReportDocument 的所有属性和方法。

Note注意

本文档的以前版本将嵌入式报表称为“强类型”。现在使用术语“嵌入式”来指添加或导入到 Visual Studio 项目的报表。

ReportDocument 是 ReportDocument 对象模型的根类。

非嵌入式报表如何工作?

非嵌入式报表始终在外部访问。可以通过多种方式使其可供 SDK 访问:

非嵌入式报表从不会被导入到项目中,因此,也从不会创建报表包装类(与嵌入式报表不同)。非嵌入式报表会在运行时分别以各种对象模型自己的方式加载到相应的对象模型中:

  • ReportDocument 对象模型使用 ReportDocument.Load() 方法将报表加载到 ReportDocument 对象模型中。
    Note注意

    这只适用于位于文件目录路径中的报表。

  • CrystalReportViewer 对象模型使用 CrystalReportViewer.ReportSource 属性将报表直接绑定到该控件。
    Note注意

    建议使用 ReportDocument 对象模型。有关更多信息,请参见“应该使用哪种对象模型?”

何时选择嵌入式报表或非嵌入式报表

如果想要简化项目的部署,应使用嵌入式报表。这样需要处理的文件会少一些,而且不必担心会将报表放到错误的文件目录路径中。这种解决方案还更安全,这是因为报表不供修改。

同时,在第一次学习使用 Visual Studio 开发和部署 Crystal Reports 时,采用嵌入报表的方式会更轻松。将报表嵌入后,它们在项目中始终作为类存在,因此既可通过 IntelliSense 显示,又可在对象浏览器中查看。您不必担心移动或删除了文件目录中的报表,也无需正确拼写其路径。

嵌入式报表更简单也更安全,但却会增加工作量。必须重新编译整个项目,才能对其进行修改。如果必须定期修改报表,应使用非嵌入式报表,这样可以更方便地访问和修改报表,而无需每次都重新编译程序集。此外,嵌入式报表的大小受到限制。将非常大的报表编译为嵌入式资源。

此外,非嵌入式报表在可伸缩性方面有优势。

Crystal Reports for Visual Studio 2005 和 Crystal Reports Basic for Visual Studio 2008 中的网站将仅使用非嵌入式报表。

报表绑定方案介绍了许多绑定嵌入式和非嵌入式报表的方式(请参见“应该使用哪种报表绑定方案?”)。您还将看到如何才能使用 ReportDocument 作为这两类报表的通用类。这样,如果决定使用另一种方式,可以最大限度地减少代码更改。