共用方式為


建立能顯示預設參數的 ListBox 控制項

本教學課程的其餘部分,是著重在顯示 ListBox 控制項中參數欄位預設值的完整清單,並且根據您從 ListBox 控制項中所做的選擇,重新篩選報表的內容。

在本節中,您會學習如何從參數欄位的預設值來填入 ListBox 控制項。

Note附註

請記得您在教學課程的開頭建立報表時,已經設定了一份大型的城市清單預設值。

為了完成這項工作,您必須先加入並設定一個 ListBox 控制項,然後再建立 Helper 方法以填入 ListBox 控制項。

若要在表單上建立並設定 ListBox 控制項

  1. 開啟 Web 或 Windows Form。

  2. 從 [檢視] 功能表中,按一下 [設計工具]。

  3. 如果您要開發網站,請執行下列步驟:

    • 按一下選取 [CrystalReportViewer] 控制項。
    • 按一下鍵盤上的向左鍵,便會出現閃爍的游標,然後按 ENTER 鍵。
CrystalReportViewer 控制項便會往下降一行。
  1. 如果您要開發 Windows 專案,請執行下列步驟:

    • 按一下選取 [CrystalReportViewer] 控制項。
    • 從 [屬性] 視窗,將 [Dock] 設為「Bottom」。
      Note附註

      在 Visual Studio 中選取 [Dock] 屬性時,會出現框架而非選項清單。選取對應至「Bottom」的框架部份。

    • 調整 Windows Form 和 [CrystalReportViewer] 控制項的大小,好讓 CrystalReportViewer 的大小足以顯示報表。在 [CrystalReportViewer] 控制項上方保留空間給 [ListBox] 控制項。
    • 從 [屬性] 視窗,將 [Anchor] 設為「Top, Bottom, Left, Right」。
    • 調整 Windows Form 和 [CrystalReportViewer] 控制項的大小,好讓 CrystalReportViewer 的大小足以顯示報表。在 [CrystalReportViewer] 控制項上方保留空間給 [ListBox] 控制項。
  2. 從 [工具箱] 中,將 [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>
  1. 按一下選取 [ListBox] 控制項。

  2. 從 [屬性] 視窗中:

    • 將 [ID] 或 [Name] 設為「defaultParameterValuesList」。
    • 將 [SelectionMode] 設為「Multiple」(在 Windows 專案中設為「MultiExtended」)。
  3. 從 [檔案] 功能表中,選取 [全部儲存]。

您現在已經可以建立能從參數欄位擷取預設值的 Helper 方法。

若要建立能從參數欄位擷取預設值的 Helper 方法

  1. 開啟 Web 或 Windows Form。

  2. 從 [檢視] 功能表,按一下 [程式碼]。

  3. 在類別底部建立新的私用方法 GetDefaultValuesFromParameterField(),將 ReportDocument 傳入方法簽名碼並指定傳回 ArrayList 執行個體。

``` vb
Private Function GetDefaultValuesFromParameterField(ByVal myReportDocument As ReportDocument) As ArrayList

End Function
```

``` csharp
private ArrayList GetDefaultValuesFromParameterField(ReportDocument reportDocument)
{
}
```
  1. 在 GetDefaultValuesFromParameterField() 方法中,透過 ReportDocument 執行個體的 DataDefinition 屬性,擷取 ParameterFieldDefinitions 索引類別。
``` vb
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
```

``` csharp
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
```
  1. 從以 PARAMETER_FIELD_NAME 常數的 ParameterFieldDefinitions 索引項目為基礎的索引類別,擷取 ParameterFieldDefinitions 執行個體。

    Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
    
    ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
    
  2. 從 ParameterFieldDefinition 執行個體的 DefaultValues 屬性中,擷取 ParameterValues 索引類別 (做為變數 defaultParameterValues)。

    Dim defaultParameterValues As ParameterValues = myParameterFieldDefinition.DefaultValues
    
    ParameterValues defaultParameterValues = parameterFieldDefinition.DefaultValues;
    
  3. 宣告並產生 ArrayList 執行個體。

    Dim myArrayList As ArrayList = New ArrayList()
    
    ArrayList arrayList = new ArrayList();
    
  4. 建立 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 下有何種可用的屬性:
  1. 如果可用的屬性為 IsRange,則請在 foreach 迴圈中輸入此程式碼:

    If (Not myParameterValue.IsRange) Then
    
    End If
    
    if(!parameterValue.IsRange)
    {
    }
    
  2. 或是,如果可用的屬性為 Kind (包含下列三個值的列舉 DiscreteOrRangeKind:DiscreteValue、RangeValue、DiscreteAndRangeValue),則請在 foreach 迴圈中改輸入此程式碼:

    If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then
    
    End If
    
    if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue)
    {
    }
    
  3. 在此巢狀條件式區塊中,將 ParameterValue 執行個體轉型為其延伸類別 DiscreteParameterValue。

    Dim myParameterDiscreteValue As ParameterDiscreteValue = CType(myParameterValue, ParameterDiscreteValue)
    
    ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue;
    
  4. 同樣在此巢狀條件式區塊中,將 ParameterDiscreteValue 執行個體的 Value 屬性 (轉換成 String) 加入 ArrayList 執行個體中。

    myArrayList.Add(myParameterDiscreteValue.Value.ToString())
    
    arrayList.Add(parameterDiscreteValue.Value.ToString());
    
  5. 在條件式區塊外部以及 foreach 迴圈外部,於方法的結尾,從方法傳回 ArrayList 執行個體。

    Return myArrayList
    
    return arrayList;
    

若要在 Web 專案中,將從方法傳回的 ArrayList 繫結到 ListBox

您已經從參數欄位擷取預設值,並從方法將它們傳回以做為 ArrayList。現在,您將學習將此 ArrayList 繫結至 defaultParameterValuesList ListBox 控制項。

程式碼會因為您使用的是 Web 專案或 Windows 專案而有些許差異;因此,請確認只完成下列的 Web 或 Windows 程序。

  1. 在 ConfigureCrystalReports() 方法中,於加入 Tokyo 字串值至 ArrayList 執行個體的程式碼之下一行,插入幾個分行符號。

    在這些分行符號中,您可以輸入設定頁面首次載入時,defaultParameterValuesList ListBox 控制項之資料來源的額外程式碼。

  2. 在這些分行符號中,建立 Not IsPostBack 條件式區塊。

    If Not IsPostBack Then
    
    End If
    
    if(!IsPostBack)
    {
    }
    
    Note附註

    Not IsPostBack 條件式區塊會用來封裝只有在頁面初次載入時才執行的程式碼。控制項通常是在 Not IsPostBack 條件式區塊內繫結至資料值,如此其資料值 (以及任何後續控制項事件) 才不會在頁面重新載入時重設。

  3. 在 Not IsPostBack 條件式區塊內,將 defaultParameterValuesList ListBox 的 DataSource 屬性設為 GetDefaultValuesFromParameterField() Helper 方法,同時傳入 CustomersByCity 報表執行個體當作方法參數。

``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```

``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```
  1. 繼續在 Not IsPostBack 條件式區塊內,呼叫 defaultParameterValuesList ListBox 的 DataBind() 方法。
``` vb
defaultParameterValuesList.DataBind()
```

``` csharp
defaultParameterValuesList.DataBind();
```

若要在 Windows 專案中,將從方法傳回的 ArrayList 繫結到 ListBox

  1. 在 ConfigureCrystalReports() 方法中,於加入 Tokyo 字串值至 ArrayList 執行個體的程式碼之下一行,插入幾個分行符號。

    在這些分行符號中,您可以輸入設定頁面首次載入時,defaultParameterValuesList ListBox 控制項之資料來源的額外程式碼。

  2. 在分行符號中,將 defaultParameterValuesList ListBox 的 DataSource 屬性設為 GetDefaultValuesFromParameterField() Helper 方法,同時傳入 CustomersByCity 報表執行個體當作方法參數。

``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```

``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```

若要測試 defaultParameterValuesList ListBox 控制項的填入狀況

您現在已經可以建置和執行此專案,驗證 defaultParameterValuesList ListBox 是否已填入。

  1. 從 [建置] 功能表選取 [建置方案]。

  2. 如果發生任何建置錯誤,請立即修正。

  3. 從 [偵錯] 功能表中,按一下 [啟動]。

defaultParameterValuesList ListBox 控制項會顯示預設值 (在本教學課程中為城市) 的完整清單。
  1. 返回 Visual Studio,再按一下 [停止] 退出偵錯模式。

在下一節中,您會加入一個按鈕,以根據 defaultParameterValuesList ListBox 控制項的選擇來重新顯示報表。