绑定到向上转换为 ReportDocument 的嵌入式报表类
对象模型
此报表绑定方案使用“通过 ReportDocument 对象模型进行报表绑定”。
报表的位置
报表嵌入在项目中。
注意 |
---|
此文档以前的版本将嵌入式报表称为“强类型”。现在使用术语“嵌入式”来指添加或导入到 Visual Studio 项目的报表。 |
说明
此报表绑定方案是对方案“绑定到嵌入式报表类”的扩展。在此方案中,将把多个嵌入式报表绑定到一个使用一组公共代码的项目,而不用分别对每个报表进行编码。
在此报表绑定方案中,将把多个嵌入式报表添加到项目中。但是不将任何嵌入式报表直接绑定到 CrystalReportViewer 控件。而是运行实用工具方法,该方法使用选择条件选择其中的一个嵌入式报表。实用工具将报表向上转换为 ReportDocument 的实例。于是 ReportDocument 实例便会绑定到控件。
注意 |
---|
ReportDocument 是所有嵌入式报表进行继承的基类。因此,可以将任何嵌入式报表向上转换为 ReportDocument。 |
优点
- 通过重构代码增强了代码的功能:一组公共报表绑定代码可以与多个嵌入式报表中的任一报表交互。如果使用以前的方案,则必须手动编写每个嵌入式报表的代码,从而增加了工作量。
- 通过代码共享减少了编码工作量:可以根据 ReportDocument 的实例编写附加代码以与 ReportDocument 对象模型完全交互。所有代码只需编写一次,但可对随后向上转换为 ReportDocument 实例的每个嵌入式报表发挥作用。
- 所有其他优点在“绑定到嵌入式报表类”中。
缺点
- 增加了维护工作:更改报表需要重新编译和重新分发应用程序。
绑定到向上转换为 ReportDocument 的嵌入式报表类
注意 |
---|
此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。 |
将两个附加示例报表添加到项目中:
- Chart.rpt
- World Sales Report.rpt
注意 按照“添加示例报表为嵌入式报表”一节中介绍的相同步骤添加报表。
将 "Imports" [Visual Basic] 或 "using" [C#] 语句添加到 CrystalDecisions.CrystalReports.Engine 命名空间的类的顶部。
注意 必须声明此命名空间以使用不带命名空间前缀的 ReportDocument 类并从 IntelliSense 访问它。
Imports CrystalDecisions.CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
创建一个专用帮助器方法以进行报表选择,如下所示。
此方法接收整数参数并通过 "Select Case" [Visual Basic] 或 "switch" [C#] 语句传递它以选择一个报表。在各种情况下,它都会实例化并返回特定的报表(向上转换为其基类 ReportDocument)。
Private Function ChooseReport(ByVal i As Integer) As ReportDocument Select Case i Case 1 Dim chartReport As Chart = New Chart() Return CType(chartReport, ReportDocument) Case 2 Dim hierarchicalGroupingReport As Hierarchical_Grouping = New Hierarchical_Grouping() Return CType(hierarchicalGroupingReport, ReportDocument) Case Else Dim worldSalesReport As World_Sales_Report = New World_Sales_Report() Return CType(worldSalesReport, ReportDocument) End Select End Function
private ReportDocument ChooseReport(int i) { switch(i) { case 1: Chart chartReport = new Chart(); return (ReportDocument)chartReport; case 2: Hierarchical_Grouping hierarchicalGroupingReport = new Hierarchical_Grouping(); return (ReportDocument)hierarchicalGroupingReport; default: World_Sales_Report worldSalesReport = new World_Sales_Report (); return (ReportDocument)worldSalesReport; }; }
在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,删除任何现有的代码并替换上以下几行新代码。
声明 ReportDocument 的实例,并通过调用 ChooseReport() 方法传入整数 1 以选择第一个报表 Chart.rpt 对该实例进行填充。
Dim myReportDocument As ReportDocument = ChooseReport(1)
ReportDocument reportDocument = ChooseReport(1);
可以创建一个占位符,在其中根据 ReportDocument 实例进行编码。
在此示例中,可以通过 RecordSelectionFormula 属性对报表数据进行过滤。因为 ReportDocument 代表多个可能的报表,所以该过滤器将被应用于传递给它的任何报表。现在,传入一个空字符串。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>这行代码说明向上转换为公共基类 ReportDocument 如何使您可以编写针对多个报表的公共代码。</p></td>
</tr>
</tbody>
</table>
``` vb
myReportDocument.RecordSelectionFormula = ""
```
``` csharp
reportDocument.RecordSelectionFormula = "";
```
将 ReportDocument 实例赋给 ReportSource 控件的 CrystalReportViewer 属性。
myCrystalReportViewer.ReportSource = myReportDocument
crystalReportViewer.ReportSource = reportDocument;
若要查看该报表,请生成并运行您的项目。