在代码中手动设置参数

现在即可为 CustomersByCity 报表的“城市”参数字段设置两个值(“Paris”和“Tokyo”)。

这涉及到一些代码编写工作,可分为以下过程:

  • 需要一个 PARAMETER_FIELD_NAME 常量来保存“城市”参数字段名,在代码中要多次使用该字段名。
  • 向参数添加当前值的代码要用于本教程中的两个不同位置,所以应将此代码作为单独的帮助器方法来创建。
  • 在 ConfigureCrystalReports() 方法中,需要向 ArrayList 实例添加“Paris”和“Tokyo”参数,并将报表和 ArrayList 实例一并传递给帮助器方法进行处理。

在下一节,将学习如何从参数字段获取默认值,并将这些值设置到 ListBox 控件中。教程结尾会使用这些值来动态选择新城市,并根据这些新选城市过滤报表。

继续浏览“创建显示默认参数的 ListBox 控件”

创建 PARAMETER_FIELD_NAME 常量

  1. 返回到此 Web 或 Windows 窗体的代码隐藏类。

  2. 在类级创建一个新的字符串常量 PARAMETER_FIELD_NAME,并将其值设置为“城市”。

    Private Const PARAMETER_FIELD_NAME As String = "City"
    
    private const string PARAMETER_FIELD_NAME = "City";
    

创建将当前值添加到报表参数的帮助器方法

现在即可创建将当前值添加到报表参数的帮助器方法。

  1. 返回到此 Web 或 Windows 窗体的代码隐藏类。

  2. 如果还没有声明 System.Collections 命名空间,则在类签名之上,向类顶部为该命名空间添加 "Imports" [Visual Basic] 或 "using" [C#] 声明。

``` vb
Imports System.Collections
```

``` csharp
using System.Collections;
```

<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>
  1. 在该类的底部,创建名为 SetCurrentValuesForParameterField() 的新私有方法,此方法签名中包含两个变量:ReportDocument 和 ArrayList。
<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>在本教程后面的部分中,如果已经使用了某个嵌入式报表,则需要将该嵌入式报表类传递到 ReportDocument 方法参数中。这是如何实现的呢?Crystal Reports 中的所有嵌入式报表类都是从 ReportDocument 基类继承的。</p></td>
</tr>
</tbody>
</table>

``` vb
Private Sub SetCurrentValuesForParameterField(ByVal myReportDocument As ReportDocument, ByVal myArrayList As ArrayList)

End Sub
```

``` csharp
private void SetCurrentValuesForParameterField(ReportDocument reportDocument, ArrayList arrayList)
{
}
```
  1. 在此方法中,声明 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 类可访问,必须在代码隐藏类的顶部包含一个 &quot;Imports&quot; [Visual Basic] 或 &quot;using&quot; [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();
```
  1. 创建一个 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)
{
}
```
  1. 在 foreach 循环中,声明并实例化 ParameterDiscreteValue 类。

    Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue()
    
    ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
    
  2. 在 foreach 循环中,将 submittedValue 转换为字符串,并将其传递给 ParameterDiscreteValue 实例的 Value 属性。

    myParameterDiscreteValue.Value = submittedValue.ToString()
    
    parameterDiscreteValue.Value = submittedValue.ToString();
    
  3. 在 foreach 循环中,将 ParameterDiscreteValue 实例添加到 currentParameterValues 索引类中。

``` vb
currentParameterValues.Add(myParameterDiscreteValue)
```

``` csharp
currentParameterValues.Add(parameterDiscreteValue);
```

这样 foreach 循环中的代码即编写完毕。应将剩余的代码(在下面的步骤中创建)放在 foreach 循环后面。
  1. 在 foreach 循环之外,从 ReportDocument 实例的 DataDefinition 属性获取 ParameterFieldDefinitions 索引类。

    Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
    
    ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
    
  2. 从基于 PARAMETER_FIELD_NAME 常量的索引条目的 ParameterFieldDefinitions索引类获取 ParameterFieldDefinition 实例。

    Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
    
    ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
    
  3. 将 currentParameterValues 实例传递给 ParameterFieldDefinition 实例的 ApplyCurrentValues 方法。

    myParameterFieldDefinition.ApplyCurrentValues(currentParameterValues)
    
    parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
    

在报表绑定到 CrystalReportViewer 控件之前调用 SetCurrentValuesForParameterField () 方法

此过程说明了如何创建这样一个方法,该方法可从 ArrayList 实例中获取提交值,并将其作为当前值放入 ParameterFieldDefinition 实例。现在,必须在报表绑定到 CrystalReportViewer 控件之前调用此方法,以使报表能够识别出它具有参数设置。

  1. 在 ConfigureCrystalReports() 方法中,在用于将报表绑定到 CrystalReportViewer 控件的代码行之前创建几行。
在这几行中,现在可以另外输入一些代码,用于将报表绑定到查看器之前对报表进行修改。
  1. 在这几行中,声明并实例化 ArrayList。

    Dim myArrayList As ArrayList = New ArrayList()
    
    ArrayList arrayList = new ArrayList();
    
  2. 向 ArrayList 实例添加“Paris”和“Tokyo”城市名字符串。

    myArrayList.Add("Paris")
    myArrayList.Add("Tokyo")
    
    arrayList.Add("Paris");
    arrayList.Add("Tokyo");
    
  3. 调用 SetCurrentValuesForParameterField() 方法,并将 CustomersByCityReport 实例和 ArrayList 实例传递给该方法。

``` vb
SetCurrentValuesForParameterField(customersByCityReport,
myArrayList)
```

``` csharp
SetCurrentValuesForParameterField(customersByCityReport,
arrayList);
```

测试 CustomersByCity 报表的加载过程

方法中的最后一行代码用于将报表绑定到 CrystalReportViewer 控件。

现在即可生成并运行项目。预计报表将成功显示,因为已经编写好将当前值设置到参数字段中的代码。

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

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

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

CustomersByCity 报表将成功显示,列出 Paris 和 Tokyo 的所有客户。
  1. 返回到 Visual Studio,然后单击“停止”从调试模式中退出。