Impostazione manuale di parametri nel codice
A questo punto è possibile impostare due valori ("Paris" e "Tokyo") nel campo parametro Città del report CustomersByCity.
Ciò implica l'esigenza di aggiungere nuovo codice, operazione che è opportuno suddividere nei seguenti processi:
- È necessaria una costante PARAMETER_FIELD_NAME per contenere il nome del campo parametro "Città", che verrà utilizzato diverse volte nel codice.
- Il codice per l’aggiunta di valori correnti al parametro viene utilizzato in due punti diversi di questa esercitazione; per questo motivo viene creato come metodo di supporto separato.
- All’interno del metodo ConfigureCrystalReports(), aggiungere i parametri "Paris" e "Tokyo" a un’istanza ArrayList e passare il report e l’istanza ArrayList al metodo di supporto per l’elaborazione.
Nella sezione successiva viene descritto come recuperare i valori predefiniti dal campo parametro e impostare tali valori in un controllo ListBox. Questi valori verranno utilizzati al termine dell’esercitazione per selezionare nuove città in modo dinamico e filtrare il report in base alle nuove città selezionate.
Passare a Creazione di un controllo ListBox che visualizzi i parametri predefiniti.
Per creare una costante PARAMETER_FIELD_NAME
Tornare alla classe di codice sottostante del Web Form o Windows Form.
A livello di classe, creare una nuova costante di stringa, PARAMETER_FIELD_NAME, e impostarne il valore su "Città".
Private Const PARAMETER_FIELD_NAME As String = "City"
private const string PARAMETER_FIELD_NAME = "City";
Per creare un metodo di supporto che aggiunga valori correnti al parametro del report
A questo punto è possibile creare il metodo di supporto che aggiunge valori correnti al parametro del report.
Tornare alla classe di codice sottostante del Web Form o Windows Form.
Sopra la firma della classe, all'inizio della classe, aggiungere una dichiarazione "Imports" [Visual Basic] o "using" [C#] per lo spazio dei nomi System.Collections (se non è stato già dichiarato).
``` vb
Imports System.Collections
```
``` csharp
using System.Collections;
```
<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>Questa dichiarazione è necessaria per accedere alla classe ArrayList.</p></td>
</tr>
</tbody>
</table>
- Alla fine della classe, creare un nuovo metodo privato denominato SetCurrentValuesForParameterField() con due variabili nella firma: ReportDocument e ArrayList.
<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>Più avanti in questa esercitazione, se è stato utilizzato un report incorporato, la classe di tale report viene passata nel parametro del metodo ReportDocument. Ciò è possibile in quanto tutte le classi di report incorporati in Crystal Reports ereditano dalla classe di base ReportDocument.</p></td>
</tr>
</tbody>
</table>
``` vb
Private Sub SetCurrentValuesForParameterField(ByVal myReportDocument As ReportDocument, ByVal myArrayList As ArrayList)
End Sub
```
``` csharp
private void SetCurrentValuesForParameterField(ReportDocument reportDocument, ArrayList arrayList)
{
}
```
- In questo metodo, dichiarare e creare un’istanza della classe indicizzata ParameterValues come variabile currentParameterValues.
<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>Affinché sia possibile accedere alla classe ParameterValues, è necessario includere una dichiarazione "Imports" [Visual Basic] o "using" [C#] all'inizio della classe di codice sottostante per lo spazio dei nomi CrystalDecisions.Shared. (tale dichiarazione è stata aggiunta in <a href="ms227453(v=vs.90).md">Configurazione di un progetto</a>).</p></td>
</tr>
</tbody>
</table>
``` vb
Dim currentParameterValues As ParameterValues = New ParameterValues()
```
``` csharp
ParameterValues currentParameterValues = new ParameterValues();
```
- Creare un ciclo foreach per recuperare tutti i valori inseriti (come tipo Object) dall’istanza ArrayList.
<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>In questo metodo, vengono recuperati i valori da ArrayList e in seguito viene scritto il codice per aggiungere i valori ad ArrayList.</p></td>
</tr>
</tbody>
</table>
``` vb
For Each submittedValue As Object In myArrayList
Next
```
``` csharp
foreach(object submittedValue in arrayList)
{
}
```
All’interno del ciclo foreach, dichiarare e creare un’istanza per la classe ParameterDiscreteValue.
Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue()
ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
Nel ciclo foreach, convertire submittedValue in stringa e passarla alla proprietà Value dell’istanza ParameterDiscreteValue.
myParameterDiscreteValue.Value = submittedValue.ToString()
parameterDiscreteValue.Value = submittedValue.ToString();
Nel ciclo foreach, aggiungere l’istanza ParameterDiscreteValue nella classe indicizzata currentParameterValues.
``` vb
currentParameterValues.Add(myParameterDiscreteValue)
```
``` csharp
currentParameterValues.Add(parameterDiscreteValue);
```
Questo completa il codice nel ciclo foreach. Il resto del codice, descritto nei passaggi successivi, viene posizionato dopo il ciclo foreach.
Fuori dal ciclo foreach, recuperare la classe indicizzata ParameterFieldDefinitions che proviene dalla proprietà DataDefinition dell’istanza ReportDocument.
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
Recuperare l’istanza ParameterFieldDefinition dalla classe indicizzata ParameterFieldDefinitions basata sulla voce di indice della costante PARAMETER_FIELD_NAME.
Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
Passare l’istanza currentParameterValues al metodo ApplyCurrentValues dell’istanza ParameterFieldDefinition.
myParameterFieldDefinition.ApplyCurrentValues(currentParameterValues)
parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
Per chiamare il metodo SetCurrentValuesForParameterField () prima che il report sia collegato al controllo CrystalReportViewer
In questa procedura è stato descritto come creare un metodo che recupera valori da un’istanza ArrayList e li posiziona come valori correnti in un’istanza di ParameterFieldDefinition. A questo punto, affinché il report rilevi le impostazioni del parametro, è necessario chiamare il metodo prima di collegare il report al controllo CrystalReportViewer.
- Nel metodo ConfigureCrystalReports(), creare nel codice una coppia di interruzioni di riga, sopra la riga che collega il report al controllo CrystalReportViewer.
In queste interruzioni di riga è possibile inserire il codice aggiuntivo che modifica il report prima che sia collegato al visualizzatore.
All’interno delle interruzioni di riga, dichiarare e creare un’istanza ArrayList.
Dim myArrayList As ArrayList = New ArrayList()
ArrayList arrayList = new ArrayList();
Aggiungere i nomi di città "Paris" e "Tokyo" come stringhe all’istanza ArrayList.
myArrayList.Add("Paris") myArrayList.Add("Tokyo")
arrayList.Add("Paris"); arrayList.Add("Tokyo");
Chiamare il metodo SetCurrentValuesForParameterField() e passare le istanze CustomersByCityReport e ArrayList.
``` vb
SetCurrentValuesForParameterField(customersByCityReport,
myArrayList)
```
``` csharp
SetCurrentValuesForParameterField(customersByCityReport,
arrayList);
```
Per verificare il caricamento del report CustomersByCity
L'ultima riga di codice del metodo collega il report al controllo CrystalReportViewer.
A questo punto è possibile creare ed eseguire il progetto. È previsto che il report venga visualizzato correttamente poiché è stato scritto il codice per l'impostazione dei valori correnti nel campo parametro.
Dal menu Genera, scegliere Genera soluzione.
Se si verificano errori di generazione, correggerli.
Dal menu Debug, scegliere Avvia.
Il report CustomersByCity viene visualizzato con i soli clienti di Paris e Tokyo.
- Tornare a Visual Studio e fare clic su Interrompi per uscire dalla modalità di debug.