现在即可为 CustomersByCity 报表的“城市”参数字段设置两个值(“Paris”和“Tokyo”)。
这涉及到一些代码编写工作,可分为以下过程:
- 需要一个 PARAMETER_FIELD_NAME 常量来保存“城市”参数字段名。
- 向城市参数添加当前值的代码要用于本教程中的两个不同位置,所以应将此代码作为单独的帮助器方法来创建。
- 在 ConfigureCrystalReports() 方法中,需要向 ArrayList 实例添加“Paris”和“Tokyo”参数,并将报表和 ArrayList 实例一并传递给帮助器方法进行处理。
创建 PARAMETER_FIELD_NAME 常量
返回到此 Web 或 Windows 窗体的代码隐藏类。
在类级创建一个新的字符串常量 PARAMETER_FIELD_NAME,并将其值设置为“城市”。
Private Const PARAMETER_FIELD_NAME As String = "City"private const string PARAMETER_FIELD_NAME = "City";
创建将当前值添加到报表参数的帮助器方法
现在即可创建将当前值添加到报表参数的帮助器方法。
返回到此 Web 或 Windows 窗体的代码隐藏类。
如果还没有声明 System.Collections 命名空间,则在类签名之上,向类顶部为该命名空间添加 "Imports" [Visual Basic] 或 "using" [C#] 声明。
<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>需要有此声明才能访问 ArrayList 类。</p></td>
</tr>
</tbody>
</table>
``` vb
Imports System.Collections
```
``` csharp
using System.Collections;
```
- 在该类的底部,创建名为 SetCurrentValuesForParameterField() 的新私有方法,在方法签名中包含两个变量:ParameterFields 和 ArrayList。
``` vb
Private Sub SetCurrentValuesForParameterField(ByVal myParameterFields As ParameterFields, ByVal myArrayList As
ArrayList)
End Sub
```
``` csharp
private void SetCurrentValuesForParameterField(ParameterFields parameterFields, ArrayList arrayList)
{
}
```
- 在此方法中,声明 ParameterValues 索引类并实例化为变量 currentParameterValues。
<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>要使 ParameterValues 类可访问,必须在代码隐藏类的顶部包含一个 "Imports" [Visual Basic] 或 "using" [C#] 声明,以引用 CrystalDecisions.Shared 命名空间。(之前在<a href="ms227453(v=vs.90).md">“项目设置”</a>中已添加此声明。)</p></td>
</tr>
</tbody>
</table>
``` vb
Dim currentParameterValues As ParameterValues = New ParameterValues()
```
``` csharp
ParameterValues currentParameterValues = new ParameterValues();
```
- 创建一个 foreach 循环,它从 ArrayList 实例获取所有提交值(作为 Object 类型)。
<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>在此方法中,从 ArrayList 获取值。稍后要编写向 ArrayList 添加值的代码。</p></td>
</tr>
</tbody>
</table>
``` vb
For Each submittedValue As Object In myArrayList
Next
```
``` csharp
foreach(object submittedValue in arrayList)
{
}
```
在 foreach 循环中,声明并实例化 ParameterDiscreteValue 类。
Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue()ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();在 foreach 循环中,将 submittedValue 转换为字符串,并将其传递给 ParameterDiscreteValue 实例的 Value 属性。
myParameterDiscreteValue.Value = submittedValue.ToString()parameterDiscreteValue.Value = submittedValue.ToString();在 foreach 循环中,将 ParameterDiscreteValue 实例添加到 currentParameterValues 索引类中。
这样 foreach 循环中的代码即编写完毕。应将剩余的代码(在下面的步骤中创建)放在 foreach 循环后面。
``` vb
currentParameterValues.Add(myParameterDiscreteValue)
```
``` csharp
currentParameterValues.Add(parameterDiscreteValue);
```
在 foreach 循环之外,从基于 PARAMETER_FIELD_NAME 常量的索引条目的 ParameterFields 索引类获取 ParameterField 实例。
Dim myParameterField As ParameterField = myParameterFields(PARAMETER_FIELD_NAME)ParameterField parameterField = parameterFields[PARAMETER_FIELD_NAME];将 currentParameterValues 实例传递给 ParameterField 实例的 CurrentValues 属性。
myParameterField.CurrentValues = currentParameterValuesparameterField.CurrentValues = currentParameterValues;
在报表绑定到 CrystalReportViewer 控件之前调用 SetCurrentValuesForParameterField () 方法
此过程说明了如何创建这样一个方法,该方法可从 ArrayList 实例中获取提交值,并将其作为当前值放入 ParameterField 实例。现在,必须在报表绑定到 CrystalReportViewer 控件之前调用此方法,以使报表能够识别出它具有参数设置。
在 ConfigureCrystalReports() 方法中,在把报表绑定到 CrystalReportViewer 控件的代码行之上声明并实例化 ArrayList。
Dim myArrayList As ArrayList = New ArrayList()ArrayList arrayList = new ArrayList();向 ArrayList 实例添加“Paris”和“Tokyo”城市名字符串。
myArrayList.Add("Paris") myArrayList.Add("Tokyo")arrayList.Add("Paris"); arrayList.Add("Tokyo");在用于绑定 CrystalReportViewer 控件的代码下面,从 CrystalReportViewer 控件的 ParameterFieldInfo 属性获取 ParameterFields 实例。
Dim myParameterFields As ParameterFields = myCrystalReportViewer.ParameterFieldInfoParameterFields parameterFields = crystalReportViewer.ParameterFieldInfo;调用 SetCurrentValuesForParameterField() 方法,并传入 ParameterFields 实例和 the ArrayList 实例。
``` vb
SetCurrentValuesForParameterField(myParameterFields, myArrayList)
```
``` csharp
SetCurrentValuesForParameterField(parameterFields, arrayList);
```
测试 CustomersByCity 报表的加载过程
现在即可生成并运行项目。预计报表将成功显示,因为已经编写好将当前值设置到参数字段中的代码。
- 从“生成”菜单中选择“生成解决方案”。
- 如果生成过程中出错,请立即纠正。
- 从“调试”菜单中,单击“开始”。
- 返回到 Visual Studio,然后单击“停止”从调试模式中退出。
在下一节,将学习如何从参数字段获取默认值,并将这些值设置到 ListBox 控件中。教程结尾会使用这些值来动态选择新城市,并根据这些新选城市过滤报表。