共用方式為


設定參數保存性

於本節中,您會設定由 ListBox 控制項建立之參數欄位選擇的保存性 (Web 型態之教學課程中)。

如使用工作階段保存「教學課程:使用工作階段保存 ReportDocument 物件模型」教學課程中所示,每當重新載入網頁或使用者按一下 CrystalReportViewer 工具列上的按鈕 (例如 [下一頁] 和 [縮放]) 時,便會遺失 ReportDocument 物件模型中所做的變更。

若要示範參數選擇缺少保存性的狀況

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

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

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

  4. 在 [ListBox] 控制項中,按住 SHIFT 鍵同時在清單中選取所有的城市。

  5. 按一下 [重新顯示報表]。

頁面將會重新載入,並且顯示所有城市中所有客戶的客戶資料錄。這會是一份包含許多頁面的大型報表。
  1. 按一下 CrystalReportViewer 工具列中的 [下一頁]。

    所選取城市的清單並不會保存。因此報表的第 2 頁不會顯示。相反的,您會再次看到啟動參數設定的畫面 (巴黎和東京)。

  2. 返回 Visual Studio,再按一下 [停止] 退出偵錯模式。

您必須將保存性程式碼加入您的應用程式,如此在 ReportDocument 物件模型中所進行的變更才會在重新載入網頁時繼續保存。

開始之前,將保存性程式碼加入 ConfigureCrystalReports() 方法中,只需要將 Else 區塊加入 Not IsPostBack 條件式區塊即可。然後,設定條件式區塊中任一條件之 ArrayList 執行個體的唯一值。頁面啟動時,將 ArrayList 執行個體設為預設值 (巴黎和東京)。頁面重新載入時,擷取儲存在工作階段中的 ArrayList 執行個體。

若要將保存性程式碼加入 ConfigureCrystalReports() 方法

  1. 在 ConfigureCrystalReports() 方法中,會剪下將 Paris 和 Tokyo 加入 ArrayList 的兩行程式碼,並貼到 If Not IsPostBack 條件式區塊的底部。

    完成後的條件式區塊如下:

    If Not IsPostBack Then
    defaultParameterValuesList.DataSource =
    GetDefaultValuesFromParameterField(customersByCityReport)
    defaultParameterValuesList.DataBind()
    myArrayList.Add("Paris")
    myArrayList.Add("Tokyo")
    End If
    
    if (!IsPostBack)
    {
    defaultParameterValuesList.DataSource =
    GetDefaultValuesFromParameterField(customersByCityReport);
    defaultParameterValuesList.DataBind();
    arrayList.Add("Paris");
    arrayList.Add("Tokyo");
    }
    
  2. 在條件式區塊底部加入最後一行,指派 ArrayList 執行個體給 Session 的程式碼。

<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>您可以把變數名稱當作您所加入之 Session 的字串識別碼。</p></td>
</tr>
</tbody>
</table>

``` vb
Session("myArrayList") = myArrayList
```

``` csharp
Session["arrayList"] = arrayList;
```
  1. 將 Else 條件加入 Not IsPostBack 條件式區塊。

  2. 在 Else 區塊內,從 Session 擷取 ArrayList 執行個體,並將其轉型為 ArrayList 物件。

    myArrayList = Ctype(Session("myArrayList"), ArrayList)
    
    arrayList = (ArrayList)Session["arrayList"];
    

完成後的條件式區塊如下:

這些對於 ConfigureCrystalReports() 方法的修改確保 ArrayList 目前的執行個體,永遠能夠傳入 SetCurrentValuesForParameterField() 方法。

於下一節中,您必須針對按一下按鈕事件的程式碼進行兩項變更:

  • 將您建立的 ArrayList 指派給 Session。
  • 將最後兩行程式碼 (配置和顯示報表) 以呼叫 ConfigureCrystalReports() 的方法取代,就可在一段共用程式碼集合上執行此功能。

若要修改按一下按鈕事件方法的程式碼,使其能與工作階段保存一起使用

  1. 最後,將下列最後兩行程式碼從按一下按鈕事件方法中刪除。

    要刪除的第一行程式碼就是呼叫 SetCurrentValuesForParameterField() 方法的程式行。要刪除的第二行程式碼是將 customersByCityReport 執行個體繫結到 CrystalReportViewer 控制項之 ReportSource 屬性的程式碼。

    在下個步驟中,您要加入兩行新的程式碼,取代刪除的程式碼。

  2. 在按一下按鈕事件方法內緊接著 foreach 迴圈的外部,加入一行程式碼,將指派 ArrayList 執行個體給 Session。

<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>您可以把變數名稱當作您所加入之 Session 的字串識別碼。</p></td>
</tr>
</tbody>
</table>

``` vb
Session("myArrayList") = myArrayList
```

``` csharp
Session["arrayList"] = arrayList;
```
  1. 呼叫 ConfigureCrystalReports() 方法。

    如此即可擷取 ArrayList 執行個體,並套用至報表,以及繫結報表至 CrystalReportViewer 控制項。

    ConfigureCrystalReports()
    
    ConfigureCrystalReports();
    

您現在已經可以建置及執行專案,以驗證是否已順利重設參數欄位。

Note附註

另一個保存的方法是保存 ReportDocument 執行個體。若要瞭解如何將 ReportDocument 執行個體保存至工作階段中,請參閱「教學課程:使用工作階段保存 ReportDocument 物件模型」教學課程。

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

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

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

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

  4. 在 [ListBox] 控制項中,按住 SHIFT 鍵同時在清單中選取所有的城市。

  5. 按一下 [重新顯示報表]。

頁面將會重新載入,並且顯示所有城市中所有客戶的客戶資料錄。這會是一份包含許多頁面的大型報表。
  1. 按一下 CrystalReportViewer 工具列中的 [下一頁]。

  2. 所選取城市的清單現在會獲得保存。因此報表的第 2 頁可正常顯示。

  3. 返回 Visual Studio,再按一下 [停止] 退出偵錯模式。