配置参数持久性

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

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

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

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

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

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

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

将会重新加载页面,然后显示所有城市中所有客户的客户记录。这是一个包含许多页面的大型报表。
  1. 在 CrystalReportViewer 工具栏上,单击“下一页”。
选定城市的列表没有保持。不会显示报表的第 2 页。而是再次看到启动参数设置(“Paris”和“Tokyo”)。
  1. 返回到 Visual Studio,然后单击“停止”从调试模式中退出。

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

必须向应用程序添加持久性代码,才能在重新加载页面时保持所做更改。

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

  1. 在 ConfigureCrystalReports() 方法中,把向 ArrayList 添加“Paris”和“Tokyo”的两行代码剪切并粘贴到 Not IsPostBack 条件块的底部。
完成后,条件块应如下所示:

``` vb
If Not IsPostBack Then
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(myParameterFields)
defaultParameterValuesList.DataBind()
myArrayList.Add("Paris")
myArrayList.Add("Tokyo")
End If
```

``` csharp
if (!IsPostBack)
{
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(parameterFields);
defaultParameterValuesList.DataBind();
arrayList.Add("Paris");
arrayList.Add("Tokyo");
}
```
  1. 向条件块添加最后一行代码,将 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"];
    

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

If Not IsPostBack Then
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(myParameterFields)
defaultParameterValuesList.DataBind()
myArrayList.Add("Paris")
myArrayList.Add("Tokyo")
Session("myArrayList") = myArrayList
Else
myArrayList = Ctype(Session("myArrayList"), ArrayList)
End If
if (!IsPostBack)
{
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(parameterFields);
defaultParameterValuesList.DataBind();
arrayList.Add("Paris");
arrayList.Add("Tokyo");
Session["arrayList"] = arrayList;
}
else
{
arrayList = (ArrayList)Session["arrayList"];
}

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

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

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

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

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

    • 要删除的第一行代码用于将报表文件目录路径绑定到 CrystalReportViewer 控件的 ReportSource 属性。
    • 要删除的第二行代码用于从 CrystalReportViewer 控件的 ParameterFieldInfo 属性获取 ParameterFields 实例。
    • 要删除的第三行代码是对 SetCurrentValuesForParameterField() 方法的调用。
在下一步中,将添加两行新代码以替换被删除的代码。
  1. 在按钮单击事件方法中,紧靠 foreach 循环的外面,添加一行将 ArrayList 实例赋给 Session 的代码。

    Note注意

    可以使用变量名作为所添加的 Session 的字符串标识符。

    Session("myArrayList") = myArrayList
    
    Session["arrayList"] = arrayList;
    
  2. 调用 ConfigureCrystalReports() 方法。

这会获取 ArrayList 实例,将其应用到报表,并把报表绑定到 CrystalReportViewer 控件。

``` vb
ConfigureCrystalReports()
```

``` csharp
ConfigureCrystalReports();
```

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

现在即可生成并运行项目,验证是否已经成功重置了参数字段。

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

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

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

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

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

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

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

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