附录:对子报表的范围参数代码的增强

您已成功修改了教程项目以使用包含子报表的报表,并对该子报表中创建的范围参数设置了订单日期范围。在此附录中,将了解如何用增强的 API 功能在子报表中读取和设置参数。

在先前的过程中,已学习了如何创建要使用 ParameterFieldDefinitions 和 ParameterFieldDefinition 类的 SetDateRangeForOrders() 帮助器方法。

在本教程中,必须删除使用 ParameterFieldDefinitions 和 ParameterFieldDefinition 类的代码行。然后,将学习如何使用增强的 Crystal Reports API 的 ParameterFields 和 ParameterField 类来编写 SetDateRangeForOrders() 方法的代码。

Note注意

增强的 API 包含 SetParameterValue(string parameterFieldName, object value, string subreport) 方法,用于带离散参数字段的子报表。因此在本教程中不能使用 SetParameterValue(),因为子报表有范围参数。

对带范围参数的子报表使用增强 Crystal Reports API

必须按照“教程:读取和设置子报表的参数”中的说明创建一个项目。

  1. 打开在本教程中所完成的项目。

  2. 打开 Web 或 Windows 窗体。

  3. 从“视图”菜单中,单击“代码”。

  4. 在 SetDateRangeForOrders() 方法中,删除使用 ParameterFieldDefinitions 或 ParameterFieldDefinition 类的代码行。删除以下几行代码:

``` vb
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME)
myParameterFieldDefinition.CurrentValues.Clear()
myParameterFieldDefinition.CurrentValues.Add(myParameterRangeValue)
myParameterFieldDefinition.ApplyCurrentValues(myParameterFieldDefinition.CurrentValues)
```

``` csharp
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME];
parameterFieldDefinition.CurrentValues.Clear();
parameterFieldDefinition.CurrentValues.Add(parameterRangeValue);
parameterFieldDefinition.ApplyCurrentValues(parameterFieldDefinition.CurrentValues);
```

下一步,将把新的 Crystal Reports API 方法添加到 SetDateRangeForOrders() 方法中用于设置范围边界类型的代码后面。
  1. 在 SetDateRangeForOrders() 方法中,从 ReportDocument 实例的 ParameterFields 属性获取 ParameterFields 实例。

    Dim myParameterFields As ParameterFields = reportDocument.ParameterFields
    
    ParameterFields parameterFields = reportDocument.ParameterFields;
    
  2. 从 ParameterFields 索引类获取 ParameterField 实例,该索引类基于两个索引值:子报表参数字段名和子报表名。传递先前在该类顶部声明的两个常量值。

    Dim myParameterField As ParameterField = myParameterFields(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME)
    
    ParameterField parameterField = parameterFields[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME];
    
  3. 调用 ParameterField 实例的 CurrentValues 属性的 Clear() 方法,以便从 CurrentValues 属性删除任何现有值。

``` vb
myParameterField.CurrentValues.Clear()
```

``` csharp
parameterField.CurrentValues.Clear();
```
  1. 将先前创建的 ParameterRangeValue 实例添加到 ParameterField 实例的 CurrentValues 属性。

    myParameterField.CurrentValues.Add(myParameterRangeValue)
    
    parameterField.CurrentValues.Add(parameterRangeValue);
    

现在即可生成并运行项目,以读取和设置子报表的范围参数。