手動設定程式碼中的參數
您現在已經可以將兩個值 (巴黎和東京) 設定到 CustomersByCity 報表的 City 參數欄位中。
這涉及一些撰寫程式碼的作業,可分為下列程序:
- 您需要 PARAMETER_FIELD_NAME 常數來保留「City」參數欄位名稱,程式碼將多次使用此項目。
- 本教學課程其他兩個不同的部分亦會使用這個將目前值加入參數的程式碼,因此,請將此程式碼建立成個別的 Helper 方法。
- 在 ConfigureCrystalReports() 方法中,將「Paris」和「Tokyo」參數加入 ArrayList 執行個體,並將報表和 ArrayList 執行個體傳送到輔助方法進行處理。
在下一節中,您會學習如何從參數欄位擷取預設值,並將那些值設定到 ListBox 控制項中。這些值將用在教學課程最後部分,根據新選取的城市,利用動態方式選取新的城市並篩選報表。
請繼續進行「建立能顯示預設參數的 ListBox 控制項」。
若要建立 PARAMETER_FIELD_NAME 常數
返回此 Web 或 Windows Form 的程式碼後置類別。
在類別層級上,建立新的字串常數 PARAMETER_FIELD_NAME,再將其值設為「城市」。
Private Const PARAMETER_FIELD_NAME As String = "City"
private const string PARAMETER_FIELD_NAME = "City";
若要建立將目前值加入報表中參數的 Helper 方法
您現在已經可以建立將目前值加入報表中參數的 Helper 方法。
返回此 Web 或 Windows Form 的程式碼後置類別。
在類別簽名碼上方,將 "Imports" [Visual Basic] 或 "using" [C#] 宣告加在 System.Collections 命名空間的類別頂端 (如果此命名空間尚未宣告的話)。
``` vb
Imports System.Collections
```
``` csharp
using System.Collections;
```
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\36bhtx7w.alert_note(zh-tw,VS.90).gif" alt="Note" class="note" />附註</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>必須具備此宣告才能存取 ArrayList 類別。</p></td>
</tr>
</tbody>
</table>
- 在類別底部建立名稱為 SetCurrentValuesForParameterField() 的新私用方法,且方法簽名碼包含兩個變數:ReportDocument 和 ArrayList。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\36bhtx7w.alert_note(zh-tw,VS.90).gif" alt="Note" class="note" />附註</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>稍後於本教學課程中,如果您使用的是內嵌報表,便會將您的內嵌報表類別傳入 ReportDocument 方法參數。這是怎麼做到的?Crystal Reports 中的所有內嵌報表類別皆會繼承 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)
{
}
```
- 在此方法中,宣告並產生 ParameterValues 執行個體,讓這些索引類別成為 currentParameterValues 變數。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\36bhtx7w.alert_note(zh-tw,VS.90).gif" alt="Note" class="note" />附註</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>為了讓 ParameterValues 類別能夠存取,必須在 CrystalDecisions.Shared 命名空間的程式碼後置類別的頂端加上 "Imports" [Visual Basic] 或 "using" [C#] 宣告。(您曾在<a href="ms227453(v=vs.90).md">「專案設定」</a>中加入這個宣告)。</p></td>
</tr>
</tbody>
</table>
``` vb
Dim currentParameterValues As ParameterValues = New ParameterValues()
```
``` csharp
ParameterValues currentParameterValues = new ParameterValues();
```
- 建立 foreach 迴圈,以從 ArrayList 執行個體擷取所有的傳送值 (做為 Object 類型)。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\36bhtx7w.alert_note(zh-tw,VS.90).gif" alt="Note" class="note" />附註</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>在此方法中,您會從 ArrayList 擷取值。之後您會撰寫將值加入 ArrayList 的程式碼。</p></td>
</tr>
</tbody>
</table>
``` vb
For Each submittedValue As Object In myArrayList
Next
```
``` csharp
foreach(object submittedValue in arrayList)
{
}
```
在 foreach 迴圈中,請宣告並產生 ParameterDiscreteValue 類別的執行個體。
Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue()
ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
在 foreach 迴圈中,將 submittedValue 轉換成字串,然後傳遞至 ParameterDiscreteValue 執行個體的 Value 屬性。
myParameterDiscreteValue.Value = submittedValue.ToString()
parameterDiscreteValue.Value = submittedValue.ToString();
在 foreach 迴圈中,將 ParameterDiscreteValue 執行個體加入 currentParameterValues 索引類別。
``` vb
currentParameterValues.Add(myParameterDiscreteValue)
```
``` csharp
currentParameterValues.Add(parameterDiscreteValue);
```
如此便完成 foreach 迴圈中的程式碼,將其餘的程式碼 (從後續的步驟開始) 放在 foreach 迴圈後。
在 foreach 迴圈的外部,請擷取 ParameterFieldDefinitions 索引類別,這是來自 ReportDocument 執行個體的 DataDefinition 屬性。
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
從以 PARAMETER_FIELD_NAME 常數的 ParameterFieldDefinitions 索引項目為基礎的索引類別,擷取 ParameterFieldDefinition 執行個體。
Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
將 currentParameterValues 執行個體傳遞到 ParameterFieldDefinition 執行個體的 ApplyCurrentValues 方法。
myParameterFieldDefinition.ApplyCurrentValues(currentParameterValues)
parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
若要在報表繫結到 CrystalReportViewer 控制項前呼叫 SetCurrentValuesForParameterField () 方法
此步驟程序將為您說明如何建立會從 ArrayList 執行個體擷取提交值的方法,並將其當做目前值放入 ParameterFieldDefinition 執行個體中。現在,您必須在報表繫結至 CrystalReportViewer 控制項之前呼叫此方法,如此報表才能知道所擁有的參數設定。
- 在 ConfigureCrystalReports() 方法中,在繫結報表到 CrystalReportViewer 控制項的程式行上方加入幾個分行符號。
在這些分行符號中,現在您可以於報表繫結到檢視器前,輸入其他修改報表的程式碼。
在分行符號中,請宣告並產生 ArrayList 執行個體。
Dim myArrayList As ArrayList = New ArrayList()
ArrayList arrayList = new ArrayList();
將城市名稱「Paris」和「Tokyo」做為字串加入 ArrayList 執行個體中。
myArrayList.Add("Paris") myArrayList.Add("Tokyo")
arrayList.Add("Paris"); arrayList.Add("Tokyo");
呼叫 SetCurrentValuesForParameterField() 方法,並且傳入 CustomersByCityReport 執行個體,以及 ArrayList 執行個體。
``` vb
SetCurrentValuesForParameterField(customersByCityReport,
myArrayList)
```
``` csharp
SetCurrentValuesForParameterField(customersByCityReport,
arrayList);
```
若要測試 CustomersByCity 報表的載入
方法中的最後一行程式碼是會將報表繫結到 CrystalReportViewer 控制項的程式碼。
您現在已經可以建置及執行您的專案。報表應該能夠正常顯示,因為已加入了設定參數欄位目前值的程式碼。
從 [建置] 功能表中,選取 [建置方案]。
如果發生任何建置錯誤,請立即修正。
從 [偵錯] 功能表中,按一下 [啟動]。
CustomersByCity 報表便會順利顯示,其中顯示出巴黎及東京的客戶清單。
- 返回 Visual Studio,再按一下 [停止] 退出偵錯模式。