在本节中,将为从 ListBox 控件所选择的参数字段配置持久性(在基于 Web 的教程中)。
演示参数选择缺乏持久性的情形
从“生成”菜单中选择“生成解决方案”。
如果生成过程中出错,请立即纠正。
从“调试”菜单中,单击“开始”。
在“ListBox”控件中,按住 SHIFT 键的同时单击选择列表中的所有城市。
单击“重新显示报表”。
将会重新加载页面,然后显示所有城市中所有客户的客户记录。这是一个包含许多页面的大型报表。
- 在 CrystalReportViewer 工具栏上,单击“下一页”。
选定城市的列表没有保持。不会显示报表的第 2 页。而是再次看到启动参数设置(“Paris”和“Tokyo”)。
- 返回到 Visual Studio,然后单击“停止”从调试模式中退出。
向 ConfigureCrystalReports() 方法添加持久性代码
必须向应用程序添加持久性代码,才能在重新加载页面时保持所做更改。
首先,要通过向 If Not IsPostBack 条件块添加 Else 块,向 ConfigureCrystalReports() 方法添加持久性代码。然后,对于条件块中的每个条件,需要为 ArrayList 实例设置唯一的值。在页面启动时,需要在 ArrayList 实例中设置默认值(“Paris”和“Tokyo”)。在页面重新加载时,需要获取存储在 Session 中的 ArrayList 实例。
- 在 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");
}
```
- 向条件块添加最后一行代码,将 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;
```
向 Not IsPostBack 条件块添加 Else 条件。
在 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 持久性
删除按钮单击事件方法中的最后三行代码。
- 要删除的第一行代码用于将报表文件目录路径绑定到 CrystalReportViewer 控件的 ReportSource 属性。
- 要删除的第二行代码用于从 CrystalReportViewer 控件的 ParameterFieldInfo 属性获取 ParameterFields 实例。
- 要删除的第三行代码是对 SetCurrentValuesForParameterField() 方法的调用。
在下一步中,将添加两行新代码以替换被删除的代码。
在按钮单击事件方法中,紧靠 foreach 循环的外面,添加一行将 ArrayList 实例赋给 Session 的代码。
注意可以使用变量名作为所添加的 Session 的字符串标识符。
Session("myArrayList") = myArrayListSession["arrayList"] = arrayList;调用 ConfigureCrystalReports() 方法。
这会获取 ArrayList 实例,将其应用到报表,并把报表绑定到 CrystalReportViewer 控件。
``` vb
ConfigureCrystalReports()
```
``` csharp
ConfigureCrystalReports();
```
验证是否已经填充 defaultParameterValuesList ListBox 控件
现在即可生成并运行项目,验证是否已经成功重置了参数字段。
从“生成”菜单中选择“生成解决方案”。
如果生成过程中出错,请立即纠正。
从“调试”菜单中,单击“开始”。
在“ListBox”控件中,按住 SHIFT 键的同时单击选择列表中的所有城市。
单击“重新显示报表”。
页面会重新加载,显示所有城市中所有客户的客户记录。这是一个包含许多页面的大型报表。
在 CrystalReportViewer 工具栏上,单击“下一页”。
现在选定城市的列表得以保持。将会显示报表的第 2 页。
返回到 Visual Studio,然后单击“停止”从调试模式中退出。