Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Objektmodell
In diesem Berichtbindungsszenario wird die Berichtbindung mit ReportDocument-Objektmodell verwendet.
Ort des Berichts
Berichte wurden in das Projekt eingebettet.
Anmerkung |
|---|
In früheren Versionen dieser Dokumentation wurden eingebettete Berichte als Berichte mit "strikter Typisierung" bezeichnet. Ab jetzt werden die einem Visual Studio-Projekt hinzugefügten bzw. darin importierten Berichte mit dem Begriff "eingebettet" beschrieben. |
Beschreibung
Dieses Berichtbindungsszenario baut auf dem Szenario Binden an eine Klasse eingebetteter Berichte auf. In diesem Szenario binden Sie zahlreiche eingebettete Berichte an ein Projekt, das einen allgemeinen Codesatz verwendet, anstatt Code für die einzelnen Berichte zu schreiben.
In diesem Berichtbindungsszenario fügen Sie dem Projekt mehrere eingebettete Berichte hinzu. Keiner der eingebetteten Berichte wird jedoch direkt an das CrystalReportViewer-Steuerelement gebunden. Stattdessen führen Sie eine Hilfsmethode aus, die Kriterien zur Auswahl eines der eingebetteten Berichte verwendet. Durch das Dienstprogramm wird für den Bericht ein Upcast auf eine Instanz von ReportDocument ausgeführt. Anschließend wird die ReportDocument-Instanz an das Steuerelement gebunden.
Anmerkung |
|---|
ReportDocument ist eine Basisklasse, von der alle eingebetteten Berichte erben. Folglich kann für alle eingebetteten Berichte ein Upcast auf ReportDocument ausgeführt werden. |
Pro
- Optimierter Code durch Refactoring: Die Verwendung eines allgemeinen Codesatzes bei der Berichtbindung ermöglicht die Interaktion mit beliebigen der zahlreichen eingebetteten Berichte. Das vorherige Szenario würde eine höhere Arbeitsbelastung bedeuten, da für jeden eingebetteten Bericht manuell Code geschrieben werden müsste.
- Geringerer Codierungsaufwand durch gemeinsame Codenutzung: Zur vollständigen Interaktion mit dem ReportDocument-Objektmodell können Sie zusätzlichen Code für die Instanz von ReportDocument schreiben. Sämtlicher Code wird nur einmal geschrieben, er wirkt sich jedoch auf alle nachfolgenden eingebetteten Berichte aus, für die ein Upcast auf die ReportDocument-Instanz ausgeführt wird.
- Alle weiteren Vorteile unter Binden an eine Klasse eingebetteter Berichte.
Contra
- Zusätzliche Wartung: Geänderte Berichte müssen neu kompiliert, und die Anwendung muss neu verteilt werden.
So binden Sie an eine Klasse eingebetteter Berichte, für die ein Upcast auf ReportDocument ausgeführt wurde
Anmerkung |
|---|
Diese Prozedur funktioniert nur bei Projekten, die in Projekt-Setup erstellt wurden. Projekt-Setup enthält spezifische Namespaceverweise und Codekonfigurationen, die für diese Prozedur erforderlich sind. Die Prozedur kann ohne diese Konfiguration nicht ausgeführt werden. Führen Sie deshalb vor Beginn dieser Arbeitsschritte die Schritte unter Projekt-Setup aus. |
Fügen Sie dem Projekt zwei weitere Musterberichte hinzu:
- Chart.rpt
- World Sales Report.rpt
AnmerkungFühren Sie zum Hinzufügen eines Berichts die Schritte unter Hinzufügen eines Musterberichts als eingebetteten Bericht aus.
Fügen Sie am Anfang der Klasse für den CrystalDecisions.CrystalReports.Engine-Namespace eine der Anweisungen "Imports" [Visual Basic] oder "using" [C#] hinzu.
AnmerkungDieser Namespace muss für die Verwendung der ReportDocument-Klasse ohne Namespacepräfix und für den Zugriff über IntelliSense deklariert werden.
Imports CrystalDecisions.CrystalReports.Engineusing CrystalDecisions.CrystalReports.Engine;Erstellen Sie wie unten angegeben eine private Hilfsmethode für die Berichtauswahl.
Diese Methode empfängt einen ganzzahligen Parameter und übergibt ihn über die Anweisung "Select Case" [Visual Basic] oder "switch" [C#] an die Berichtauswahl. In beiden Fällen wird ein bestimmter Bericht instantiiert und zurückgegeben (für den ein Upcast auf seine Basisklasse ReportDocument ausgeführt wurde).
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 Functionprivate 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; }; }Löschen Sie innerhalb der (im Projekt-Setup erstellten) ConfigureCrystalReports()-Methode vorhandenen Code, und ersetzen Sie ihn durch die folgenden neuen Codezeilen.
Deklarieren Sie eine Instanz von ReportDocument, und füllen Sie diese mit Daten, indem Sie die ChooseReport()-Methode aufrufen. Dabei übergeben Sie die Ganzzahl 1, um den ersten Bericht "Chart.rpt" auszuwählen.
Dim myReportDocument As ReportDocument = ChooseReport(1)ReportDocument reportDocument = ChooseReport(1);Sie können einen Platzhalter erstellen, in dem Code für die ReportDocument-Instanz programmiert wird.
In diesem Beispiel könnten Berichtdaten mit der RecordSelectionFormula-Eigenschaft gefiltert werden. Da ReportDocument für eine Vielzahl möglicher Berichte steht, wird der Filter auf jeden übergebenen Bericht angewendet. In diesem Fall übergeben Sie eine leere Zeichenfolge.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\xkh1wxd8.alert_note(de-de,VS.90).gif" alt="Note" class="note" />Anmerkung</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Durch diese Codezeile wird veranschaulicht, wie ein Upcast auf die allgemeine Basisklasse ReportDocument das Schreiben allgemeinen Codes für mehrere Berichte ermöglicht.</p></td>
</tr>
</tbody>
</table>
``` vb
myReportDocument.RecordSelectionFormula = ""
```
``` csharp
reportDocument.RecordSelectionFormula = "";
```
Weisen Sie der ReportSource-Eigenschaft des CrystalReportViewer-Steuerelements die ReportDocument-Instanz zu.
myCrystalReportViewer.ReportSource = myReportDocumentcrystalReportViewer.ReportSource = reportDocument;Um den Bericht anzeigen zu lassen, erstellen Sie Ihr Projekt und führen es aus.