ReportDocument にアップキャストする埋め込み Report クラスへのバインド
オブジェクト モデル
このレポートをバインドするシナリオは、「ReportDocument オブジェクト モデルによるレポートのバインド」を使用します。
レポートの場所
レポートはプロジェクトに埋め込まれます。
注 |
---|
本書の以前のバージョンでは、埋め込みレポートは“厳密に型指定された”レポートと呼ばれていました。Visual Studio プロジェクトに追加またはインポートされたレポートを意味する用語として、現在は“埋め込み”が使用されています。 |
説明
このレポートをバインドするシナリオは、「埋め込みレポート クラスへのバインド」のシナリオを拡張します。このシナリオでは、多くの埋め込みレポートをプロジェクトにバインドします。プロジェクトでは個別のコードを使用せず、1 つのコード共有セットを使用します。
このレポートをバインドするシナリオでは、多くの埋め込みレポートをプロジェクトに追加します。しかし、この埋め込みレポートは、CrystalReportViewer コントロールに直接バインドしません。代わりに、選択条件を使用するユーティリティ メソッドを実行し、埋め込みレポートの 1 つを選択します。このユーティリティはレポートを ReportDocument のインスタンスにアップキャストします。ReportDocument インスタンスはコントロールにバインドされます。
注 |
---|
ReportDocument はすべての埋め込みレポートに継承される基本クラスです。したがって、あらゆる埋め込みレポートは ReportDocument へのアップキャストが可能です。 |
長所
- リファクタリングによるコードの改良:レポートをバインドするコードの共有セットにより、複数の埋め込みレポートの 1 つと対話できます。以前のシナリオでは、各埋め込みレポートごとに手動でコード化する必要があり、作業時間が増加する場合もありました。
- 共有化によるコードの削減:ReportDocument のインスタンスに追加のコードを書き込むことができ、ReportDocument オブジェクト モデルと完全に対話できます。すべてのコードを一度書き込むだけで、ReportDocument インスタンスにアップキャストされる個々の埋め込みレポートにも継承されます。
- 他のすべての長所については、「埋め込みレポート クラスへのバインド」を参照してください。
短所
- 煩雑なメンテナンス:レポートを変更すると、アプリケーションの再コンパイルと再配布が必要になります。
ReportDocument にアップキャストされる埋め込みレポート クラスにバインドする
注 |
---|
この手順は、「プロジェクトの設定」で作成されたプロジェクトにのみ有効です。「プロジェクトの設定」では、この手順で必要な特定の名前空間の参照とコード設定が説明されており、この設定は、この手順を完了するために必須です。したがって、この手順を始める前にまず、「プロジェクトの設定」の手順を実行しておく必要があります。 |
2 つのサンプル レポートをプロジェクトに追加します。
- 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() メソッドを呼び出すことでインスタンスを操作し、最初のレポート Chart.rpt が選択されるように整数値 1 を渡します。
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/w5dk7atd.alert_note(ja-jp,VS.90).gif" title="Note" 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 インスタンスを CrystalReportViewer コントロールの ReportSource プロパティに割り当てます。
myCrystalReportViewer.ReportSource = myReportDocument
crystalReportViewer.ReportSource = reportDocument;
レポートを表示するには、プロジェクトをビルドおよび実行してください。