绑定到向上转换为 ReportDocument 的嵌入式报表类

对象模型

此报表绑定方案使用“通过 ReportDocument 对象模型进行报表绑定”

报表的位置

报表嵌入在项目中。

Note注意

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

说明

此报表绑定方案是对方案“绑定到嵌入式报表类”的扩展。在此方案中,将把多个嵌入式报表绑定到一个使用一组公共代码的项目,而不用分别对每个报表进行编码。

在此报表绑定方案中,将把多个嵌入式报表添加到项目中。但是不将任何嵌入式报表直接绑定到 CrystalReportViewer 控件。而是运行实用工具方法,该方法使用选择条件选择其中的一个嵌入式报表。实用工具将报表向上转换为 ReportDocument 的实例。于是 ReportDocument 实例便会绑定到控件。

Note注意

ReportDocument 是所有嵌入式报表进行继承的基类。因此,可以将任何嵌入式报表向上转换为 ReportDocument。

优点

  • 通过重构代码增强了代码的功能:一组公共报表绑定代码可以与多个嵌入式报表中的任一报表交互。如果使用以前的方案,则必须手动编写每个嵌入式报表的代码,从而增加了工作量。
  • 通过代码共享减少了编码工作量:可以根据 ReportDocument 的实例编写附加代码以与 ReportDocument 对象模型完全交互。所有代码只需编写一次,但可对随后向上转换为 ReportDocument 实例的每个嵌入式报表发挥作用。
  • 所有其他优点在“绑定到嵌入式报表类”中。

缺点

  • 增加了维护工作:更改报表需要重新编译和重新分发应用程序。

绑定到向上转换为 ReportDocument 的嵌入式报表类

Note注意

此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。

  1. 将两个附加示例报表添加到项目中:

  2. 将 "Imports" [Visual Basic] 或 "using" [C#] 语句添加到 CrystalDecisions.CrystalReports.Engine 命名空间的类的顶部。

    Note注意

    必须声明此命名空间以使用不带命名空间前缀的 ReportDocument 类并从 IntelliSense 访问它。

    Imports CrystalDecisions.CrystalReports.Engine
    
    using CrystalDecisions.CrystalReports.Engine;
    
  3. 创建一个专用帮助器方法以进行报表选择,如下所示。

    此方法接收整数参数并通过 "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;
    
    };
    }
    
  4. 在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,删除任何现有的代码并替换上以下几行新代码。

  5. 声明 ReportDocument 的实例,并通过调用 ChooseReport() 方法传入整数 1 以选择第一个报表 Chart.rpt 对该实例进行填充。

    Dim myReportDocument As ReportDocument = ChooseReport(1)
    
    ReportDocument reportDocument = ChooseReport(1);
    
  6. 可以创建一个占位符,在其中根据 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 = "";
```
  1. 将 ReportDocument 实例赋给 ReportSource 控件的 CrystalReportViewer 属性。

    myCrystalReportViewer.ReportSource = myReportDocument
    
    crystalReportViewer.ReportSource = reportDocument;
    
  2. 若要查看该报表,请生成并运行您的项目。

请参见