配置参数持久性

在本节中,将为从 ListBox 控件所选择的参数字段配置持久性(在基于 Web 的教程中)。

正如教程“教程:使用 Session 保持 ReportDocument 对象模型”中所演示的情形,每当用户单击 CrystalReportViewer 工具栏上的按钮(如“下一页”和“缩放”)而使 Web 页面重新加载时,在 ReportDocument 对象模型中所做的更改都会丢失。

演示参数选择缺乏持久性的情形

  1. 从“生成”菜单中选择“生成解决方案”。

  2. 如果生成过程中出错,请立即纠正。

  3. 从“调试”菜单中,单击“开始”。

  4. 在“ListBox”控件中,按住 SHIFT 键的同时单击选择列表中的所有城市。

  5. 单击“重新显示报表”。

将会重新加载页面,然后显示所有城市中所有客户的客户记录。这是一个包含许多页面的大型报表。
  1. 在 CrystalReportViewer 工具栏上,单击“下一页”。

    选定城市的列表没有保持。不会显示报表的第 2 页。而是再次看到启动参数设置(“Paris”和“Tokyo”)。

  2. 返回到 Visual Studio,然后单击“停止”从调试模式中退出。

必须向应用程序添加持久性代码,才能在重新加载 Web 页面时保持在 ReportDocument 对象模型中所做的更改。

首先,要通过向 Not IsPostBack 条件块添加 Else 块,向 ConfigureCrystalReports() 方法添加持久性代码。然后,对于条件块中的每个条件,需要为 ArrayList 实例设置唯一的值。在页面启动时,需要在 ArrayList 实例中设置默认值(“Paris”和“Tokyo”)。在页面重新加载时,需要获取存储在 Session 中的 ArrayList 实例。

向 ConfigureCrystalReports() 方法添加持久性代码

  1. 在 ConfigureCrystalReports() 方法中,将向 ArrayList 添加“Paris”和“Tokyo”的两行代码剪切并粘贴到 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/8yfdxzdx.alert_note(zh-cn,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. 向 Not IsPostBack 条件块添加 Else 条件。

  2. 在 Else 块中,从 Session 获取 ArrayList 实例,并将其转换为 ArrayList 对象。

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

完成后,条件块应如下所示:

对 ConfigureCrystalReports() 方法的这些修改确保了 ArrayList 的当前实例总是可以传递到 SetCurrentValuesForParameterField() 方法中。

在下一节中,将对按钮单击事件中的代码进行两处更改:

  • 获取创建的 ArrayList,并将其赋给 Session。
  • 将最后两行代码(用于配置和显示报表)替换为对 ConfigureCrystalReports() 方法的调用,以便在一组公共代码上执行此功能。

修改按钮单击事件方法中的代码以使用 Session 持久性

  1. 删除按钮单击事件方法中的以下最后两行代码。

    要删除的第一行代码是对 SetCurrentValuesForParameterField() 方法的调用。要删除的第二行代码用于将 customersByCityReport 实例绑定到 CrystalReportViewer 控件的 ReportSource 属性。

    在下一步中,将添加两行新代码以替换被删除的代码。

  2. 在按钮单击事件方法中,紧靠 foreach 循环的外面,添加一行将 ArrayList 实例赋给 Session 的代码。

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,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 实例保持到 Session,请参见教程“教程:使用 Session 保持 ReportDocument 对象模型”

验证是否已经填充 defaultParameterValuesList ListBox 控件

  1. 从“生成”菜单中选择“生成解决方案”。

  2. 如果生成过程中出错,请立即纠正。

  3. 从“调试”菜单中,单击“开始”。

  4. 在“ListBox”控件中,按住 SHIFT 键的同时单击选择列表中的所有城市。

  5. 单击“重新显示报表”。

页面会重新加载,显示所有城市中所有客户的客户记录。这是一个包含许多页面的大型报表。
  1. 在 CrystalReportViewer 工具栏上,单击“下一页”。

  2. 现在选定城市的列表得以保持。将会显示报表的第 2 页。

  3. 返回到 Visual Studio,然后单击“停止”从调试模式中退出。