Aggiunta del codice di accesso del sottoreport
A questo punto è possibile aggiungere il codice di accesso per il sottoreport nella classe di codice sottostante. Iniziare creando un metodo di supporto privato denominato SetDBLogonForSubreports().
Per creare e codificare il metodo SetDBLogonForSubreports()
Aprire il Web Form o il Windows Form.
Dal menu Visualizza, scegliere Codice.
Alla fine della classe creare un nuovo metodo privato denominato SetDBLogonForSubreports() con due parametri ConnectionInfo e ReportDocument.
``` vb
Private Sub SetDBLogonForSubreports(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
End Sub
```
``` csharp
private void SetDBLogonForSubreports(ConnectionInfo connectionInfo, ReportDocument reportDocument)
{
}
```
- All'interno del metodo, recuperare l'istanza Sections dalla proprietà Sections della proprietà ReportDefinitiondel parametro ReportDocument.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\Aa983431.alert_note(it-it,VS.90).gif" alt="Note" class="note" />Nota</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Sections è una classe indicizzata contenente istanze della classe Section.</p></td>
</tr>
</tbody>
</table>
``` vb
Dim mySections As Sections = myReportDocument.ReportDefinition.Sections
```
``` csharp
Sections sections = reportDocument.ReportDefinition.Sections;
```
Creare un ciclo foreach che passi attraverso tutte le istanze Section nell’istanza della classe indicizzata Sections.
For Each mySection As Section In mySections Next
foreach(Section section in sections) { }
Nel ciclo foreach, recuperare l'istanza ReportObjects dalla proprietà ReportObjects dell'istanza Section.
Dim myReportObjects As ReportObjects = mySection.ReportObjects
ReportObjects reportObjects = section.ReportObjects;
Nel ciclo foreach, creare un nuovo ciclo foreach nidificato che passi attraverso tutte le istanze ReportObject nell'istanza della classe indicizzata ReportObjects.
For Each myReportObject As ReportObject In myReportObjects Next
foreach(ReportObject reportObject in reportObjects) { }
Nel ciclo foreach nidificato, creare un blocco condizionale che verifichi se la proprietà Kind dell'istanza ReportObject è uguale alla selezione SubreportObject dell'enumerazione ReportObjectKind.
If myReportObject.Kind = ReportObjectKind.SubreportObject Then End If
if(reportObject.Kind == ReportObjectKind.SubreportObject) { }
Nel blocco condizionale, eseguire il cast dell'istanza ReportObject in un'istanza SubreportObject.
Dim mySubreportObject As SubreportObject = CType(myReportObject, SubreportObject)
SubreportObject subreportObject = (SubreportObject)reportObject;
Sempre all'interno del blocco condizionale, dichiarare una nuova istanza di ReportDocument come variabile subReportDocument e compilarla chiamando il metodo OpenSubreport() dell'istanza SubreportObject .
``` vb
Dim subReportDocument As ReportDocument = mySubreportObject.OpenSubreport(mySubreportObject.SubreportName)
```
``` csharp
ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName);
```
- Infine, nel blocco condizionale, chiamare il metodo SetDBLogonForReport() originale e passargli il parametro ConnectionInfo e la nuova variabile subReportDocument.
``` vb
SetDBLogonForReport(myConnectionInfo, subReportDocument)
```
``` csharp
SetDBLogonForReport(connectionInfo, subReportDocument);
```
Per modificare il metodo ConfigureCrystalReports() in modo da fare riferimento al codice di accesso al database per i sottoreport
Con questa procedura è stato creato un metodo per recuperare tutti i possibili sottoreport come istanze di ReportDocument. Ogni istanza ReportDocument di sottoreport viene quindi passata al metodo originale per l'impostazione dell'accesso a un database SQL Server protetto.
A questo punto diventa necessario modificare il metodo ConfigureCrystalReports() in modo da fare riferimento al metodo originale e consentire l'elaborazione delle informazioni di accesso al database dei sottoreport.
Nel metodo ConfigureCrystalReports() creare nel codice una coppia di interruzioni di riga sopra la riga che collega il report al controllo CrystalReportViewer.
Tra le interruzioni di riga, inserire una chiamata al metodo SetDBLogonForSubreports() passando l'istanza ConnectionInfo e il report NorthwindCustomers.
``` vb
SetDBLogonForSubreports(myConnectionInfo, northwindCustomersReport)
```
``` csharp
SetDBLogonForSubreports(connectionInfo, northwindCustomersReport);
```
Per verificare il caricamento del report NorthwindCustomers
Dopo la chiamata si trova il codice originale che collega il report al controllo CrystalReportViewer.
A questo punto è possibile creare ed eseguire il progetto. È previsto che il report e il sottoreport vengano caricati correttamente, poiché è stato scritto il codice per l'accesso al database di qualsiasi sottoreport.
Dal menu Genera, scegliere Genera soluzione.
Se si verificano errori di generazione, correggerli.
Dal menu Debug, scegliere Avvia.
Il report NorthwindCustomers, con il nuovo sottoreport CustomerOrders, viene visualizzato correttamente.
Tornare a Visual Studio e fare clic su Interrompi per uscire dalla modalità di debug.