建立能顯示預設參數的 ListBox 控制項
本教學課程的其餘部分,是著重在顯示 ListBox 控制項中參數欄位預設值的完整清單,並且根據您從 ListBox 控制項中所做的選擇,重新篩選報表的內容。
在本節中,您會學習如何從參數欄位的預設值來填入 ListBox 控制項。
附註 |
---|
請記得您在教學課程的開頭建立報表時,已經設定了一份大型的城市清單預設值。 |
為了完成這項工作,您必須先加入並設定一個 ListBox 控制項,然後再建立 Helper 方法以填入 ListBox 控制項。
若要在表單上建立並設定 ListBox 控制項
開啟 Web 或 Windows Form。
從 [檢視] 功能表中,按一下 [設計工具]。
如果您要開發網站,請執行下列步驟:
- 按一下選取 [CrystalReportViewer] 控制項。
- 按一下鍵盤上的向左鍵,便會出現閃爍的游標,然後按 ENTER 鍵。
CrystalReportViewer 控制項便會往下降一行。
如果您要開發 Windows 專案,請執行下列步驟:
- 按一下選取 [CrystalReportViewer] 控制項。
- 從 [屬性] 視窗,將 [Dock] 設為「Bottom」。
附註 在 Visual Studio 中選取 [Dock] 屬性時,會出現框架而非選項清單。選取對應至「Bottom」的框架部份。
- 調整 Windows Form 和 [CrystalReportViewer] 控制項的大小,好讓 CrystalReportViewer 的大小足以顯示報表。在 [CrystalReportViewer] 控制項上方保留空間給 [ListBox] 控制項。
- 從 [屬性] 視窗,將 [Anchor] 設為「Top, Bottom, Left, Right」。
- 調整 Windows Form 和 [CrystalReportViewer] 控制項的大小,好讓 CrystalReportViewer 的大小足以顯示報表。在 [CrystalReportViewer] 控制項上方保留空間給 [ListBox] 控制項。
從 [工具箱] 中,將 [ListBox] 控制項拖曳到 [CrystalReportViewer] 控制項上方。
<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>使用 Visual Studio 時,如果「智慧工具提示」出現在 ListBox 上,請按 Esc 鍵將其關閉。</p></td>
</tr>
</tbody>
</table>
按一下選取 [ListBox] 控制項。
從 [屬性] 視窗中:
- 將 [ID] 或 [Name] 設為「defaultParameterValuesList」。
- 將 [SelectionMode] 設為「Multiple」(在 Windows 專案中設為「MultiExtended」)。
從 [檔案] 功能表中,選取 [全部儲存]。
您現在已經可以建立能從參數欄位擷取預設值的 Helper 方法。
若要建立能從參數欄位擷取預設值的 Helper 方法
開啟 Web 或 Windows Form。
從 [檢視] 功能表,按一下 [程式碼]。
在類別底部建立新的私用方法 GetDefaultValuesFromParameterField(),將 ReportDocument 傳入方法簽名碼並指定傳回 ArrayList 執行個體。
``` vb
Private Function GetDefaultValuesFromParameterField(ByVal myReportDocument As ReportDocument) As ArrayList
End Function
```
``` csharp
private ArrayList GetDefaultValuesFromParameterField(ReportDocument reportDocument)
{
}
```
- 在 GetDefaultValuesFromParameterField() 方法中,透過 ReportDocument 執行個體的 DataDefinition 屬性,擷取 ParameterFieldDefinitions 索引類別。
``` vb
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
```
``` csharp
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
```
從以 PARAMETER_FIELD_NAME 常數的 ParameterFieldDefinitions 索引項目為基礎的索引類別,擷取 ParameterFieldDefinitions 執行個體。
Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
從 ParameterFieldDefinition 執行個體的 DefaultValues 屬性中,擷取 ParameterValues 索引類別 (做為變數 defaultParameterValues)。
Dim defaultParameterValues As ParameterValues = myParameterFieldDefinition.DefaultValues
ParameterValues defaultParameterValues = parameterFieldDefinition.DefaultValues;
宣告並產生 ArrayList 執行個體。
Dim myArrayList As ArrayList = New ArrayList()
ArrayList arrayList = new ArrayList();
建立 foreach 迴圈,以從 defaultParameterValues 擷取每一個 ParameterValue 執行個體。
``` vb
For Each myParameterValue As ParameterValue In defaultParameterValues
Next
```
``` csharp
foreach(ParameterValue parameterValue in defaultParameterValues)
{
}
```
在 foreach 迴圈中,建立可檢查離散參數值 (相對於範圍值) 的巢狀條件式區塊。因為 API 在 Crystal Reports for Visual Studio 各版本中都略有更動,所以此條件式區塊有兩個版本。請檢查您的 API (使用 IntelliSense) 來查看在 ParameterValue 下有何種可用的屬性:
如果可用的屬性為 IsRange,則請在 foreach 迴圈中輸入此程式碼:
If (Not myParameterValue.IsRange) Then End If
if(!parameterValue.IsRange) { }
或是,如果可用的屬性為 Kind (包含下列三個值的列舉 DiscreteOrRangeKind:DiscreteValue、RangeValue、DiscreteAndRangeValue),則請在 foreach 迴圈中改輸入此程式碼:
If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then End If
if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue) { }
在此巢狀條件式區塊中,將 ParameterValue 執行個體轉型為其延伸類別 DiscreteParameterValue。
Dim myParameterDiscreteValue As ParameterDiscreteValue = CType(myParameterValue, ParameterDiscreteValue)
ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue;
同樣在此巢狀條件式區塊中,將 ParameterDiscreteValue 執行個體的 Value 屬性 (轉換成 String) 加入 ArrayList 執行個體中。
myArrayList.Add(myParameterDiscreteValue.Value.ToString())
arrayList.Add(parameterDiscreteValue.Value.ToString());
在條件式區塊外部以及 foreach 迴圈外部,於方法的結尾,從方法傳回 ArrayList 執行個體。
Return myArrayList
return arrayList;
若要在 Web 專案中,將從方法傳回的 ArrayList 繫結到 ListBox
您已經從參數欄位擷取預設值,並從方法將它們傳回以做為 ArrayList。現在,您將學習將此 ArrayList 繫結至 defaultParameterValuesList ListBox 控制項。
程式碼會因為您使用的是 Web 專案或 Windows 專案而有些許差異;因此,請確認只完成下列的 Web 或 Windows 程序。
在 ConfigureCrystalReports() 方法中,於加入 Tokyo 字串值至 ArrayList 執行個體的程式碼之下一行,插入幾個分行符號。
在這些分行符號中,您可以輸入設定頁面首次載入時,defaultParameterValuesList ListBox 控制項之資料來源的額外程式碼。
在這些分行符號中,建立 Not IsPostBack 條件式區塊。
If Not IsPostBack Then End If
if(!IsPostBack) { }
附註 Not IsPostBack 條件式區塊會用來封裝只有在頁面初次載入時才執行的程式碼。控制項通常是在 Not IsPostBack 條件式區塊內繫結至資料值,如此其資料值 (以及任何後續控制項事件) 才不會在頁面重新載入時重設。
在 Not IsPostBack 條件式區塊內,將 defaultParameterValuesList ListBox 的 DataSource 屬性設為 GetDefaultValuesFromParameterField() Helper 方法,同時傳入 CustomersByCity 報表執行個體當作方法參數。
``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```
``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```
- 繼續在 Not IsPostBack 條件式區塊內,呼叫 defaultParameterValuesList ListBox 的 DataBind() 方法。
``` vb
defaultParameterValuesList.DataBind()
```
``` csharp
defaultParameterValuesList.DataBind();
```
若要在 Windows 專案中,將從方法傳回的 ArrayList 繫結到 ListBox
在 ConfigureCrystalReports() 方法中,於加入 Tokyo 字串值至 ArrayList 執行個體的程式碼之下一行,插入幾個分行符號。
在這些分行符號中,您可以輸入設定頁面首次載入時,defaultParameterValuesList ListBox 控制項之資料來源的額外程式碼。
在分行符號中,將 defaultParameterValuesList ListBox 的 DataSource 屬性設為 GetDefaultValuesFromParameterField() Helper 方法,同時傳入 CustomersByCity 報表執行個體當作方法參數。
``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```
``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```
若要測試 defaultParameterValuesList ListBox 控制項的填入狀況
您現在已經可以建置和執行此專案,驗證 defaultParameterValuesList ListBox 是否已填入。
從 [建置] 功能表選取 [建置方案]。
如果發生任何建置錯誤,請立即修正。
從 [偵錯] 功能表中,按一下 [啟動]。
defaultParameterValuesList ListBox 控制項會顯示預設值 (在本教學課程中為城市) 的完整清單。
- 返回 Visual Studio,再按一下 [停止] 退出偵錯模式。
在下一節中,您會加入一個按鈕,以根據 defaultParameterValuesList ListBox 控制項的選擇來重新顯示報表。