创建显示默认参数的 ListBox 控件

本教程的其余部分将介绍如何在 ListBox 控件中显示参数字段默认值的完整列表,以及如何根据在 ListBox 控件中所做的选择重新过滤报表内容。

在本节中,将学习如何用参数字段默认值填充 ListBox 控件。

Note注意

您应记得在教程一开始创建此报表时即设置了“默认值”(一个较大的城市列表)。

为此,必须添加和配置一个 ListBox 控件,然后创建一个帮助器方法来填充 ListBox 控件。

在窗体中创建和配置 ListBox 控件

  1. 打开 Web 或 Windows 窗体。
  2. 从“视图”菜单中,单击“设计器”。
  3. 如果在开发网站,则执行以下操作:
  4. 单击 CrystalReportViewer 控件,将其选中。
  5. 在键盘上按左箭头,待出现闪烁的光标后,按 Enter 键。
  6. 如果在开发 Windows 项目,则执行以下操作:
    1. 单击 CrystalReportViewer 控件,将其选中。
    2. 从“属性”窗口中,将 Dock 设置为“Bottom”。
    3. 调整 CrystalReportViewer 控件的大小,在其上方为 ListBox 控件留出足够的空间。
    4. 从“属性”窗口中,将 Anchor 设置为“top, Bottom, Left, Right”。
  7. 从“工具箱”中,将 ListBox 控件拖到 CrystalReportViewer 控件的上方。
  8. 单击 ListBox 控件选中它。
  9. 从“属性”窗口中执行以下操作:
  10. 将“ID”或“Name”设置为“defaultParameterValuesList”。
  11. 将“SelectionMode”设置为“Multiple”(在 Windows 项目中,设置为“MultiExtended”)。
  12. 从“文件”菜单中选择“全部保存”。

创建从参数字段中获取默认值的帮助器方法

现在即可创建从参数字段中获取默认值的帮助器方法。

  1. 打开 Web 或 Windows 窗体。

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

  3. 在该类的底部,创建可以返回 ArrayList 实例的名为 GetDefaultValuesFromParameterField() 的新私有方法,并将 ParameterFields 传递给方法签名。

``` vb
Private Function GetDefaultValuesFromParameterField(ByVal
myParameterFields As ParameterFields) As ArrayList

End Function
```

``` csharp
private ArrayList
GetDefaultValuesFromParameterField(ParameterFields parameterFields)
{
}
```
  1. 根据 PARAMETER_FIELD_NAME 常量的索引条目,从 ParameterFields 索引类中获取 ParameterField 实例。

    Dim myParameterField As ParameterField =
    myParameterFields(PARAMETER_FIELD_NAME)
    
    ParameterField parameterField =
    parameterFields[PARAMETER_FIELD_NAME];
    
  2. 从 ParameterField 实例的 DefaultValues 属性中,获取 ParameterValues 索引类(作为变量 defaultParameterValues)。

    Dim defaultParameterValues As ParameterValues =
    myParameterField.DefaultValues
    
    ParameterValues defaultParameterValues =
    parameterField.DefaultValues;
    
  3. 声明并实例化 ArrayList。

    Dim myArrayList As ArrayList = New ArrayList()
    
    ArrayList arrayList = new ArrayList();
    
  4. 创建一个 foreach 循环,从 defaultParameterValues 中获取各个 ParameterValue 实例。

在 foreach 循环中,现在要创建用于检查离散(相对于范围)参数值的嵌套条件块。此条件块有两个版本,这是因为对于 Crystal Reports for Visual Studio 的不同版本,API 略有更改。检查所用的 API(使用 IntelliSense),查看 ParameterValue 下有哪些属性可用:

``` vb
For Each myParameterValue As ParameterValue In
defaultParameterValues

Next
```

``` csharp
foreach(ParameterValue parameterValue in defaultParameterValues)
{
}
```
  1. 如果可用属性为 IsRange,则在 foreach 循环中输入以下代码:

    If (Not myParameterValue.IsRange) Then
    
    End If
    
    if(!parameterValue.IsRange)
    {
    }
    
  2. 或者,如果可用属性为 Kind(DiscreteOrRangeKind,它是具有以下三个值的枚举:DiscreteValue、RangeValue、DiscreteAndRangeValue),则在 foreach 循环中改为输入以下代码:

    If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then
    
    End If
    
    if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue)
    {
    }
    
  3. 在此嵌套条件块中,将 ParameterValue 实例转换为其扩展类 DiscreteParameterValue。

    Dim myParameterDiscreteValue As ParameterDiscreteValue =
    CType(myParameterValue, ParameterDiscreteValue)
    
    ParameterDiscreteValue parameterDiscreteValue =
    (ParameterDiscreteValue)parameterValue;
    
  4. 同样在此嵌套条件块中,将 ParameterDiscreteValue 实例的 Value 属性(已转换为字符串)添加到 ArrayList 实例中。

    myArrayList.Add(myParameterDiscreteValue.Value.ToString())
    
    arrayList.Add(parameterDiscreteValue.Value.ToString());
    
  5. 在条件块之外和 foreach 循环之外,并在方法的末尾,从该方法返回 ArrayList 实例。

    Return myArrayList
    
    return arrayList;
    

把从方法返回的 ArrayList 绑定到 Web 项目中的 ListBox

已经从参数字段中获取了默认值,并作为 ArrayList 从方法中返回了这些值。现在要将此 ArrayList 绑定到 defaultParameterValuesListListBox 控件。

根据是使用 Web 项目还是 Windows 项目,代码会略有不同;因此,确保仅完成下面的 Web 或 Windows 过程即可。

  1. 在 ConfigureCrystalReports() 方法中,紧随获取 ParameterFields 实例的代码行之后,在代码中创建几行。

  2. 在这几行中,创建 Not IsPostBack 条件块。

    Note注意

    Not IsPostBack 条件块用于封装只应在首次加载页面时才运行的代码。在 Not IsPostBack 条件块中,控件通常都绑定到数据值,这样它们的数据值(以及所有后续控件事件)才不会在重新加载页面时重置。

    If Not IsPostBack Then
    
    End If
    
    if(!IsPostBack)
    {
    }
    
  3. 在 Not IsPostBack 条件块中,将 defaultParameterValuesListListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,并将 ParameterFields 实例作为方法参数传递。

``` vb
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(myParameterFields)
```

``` csharp
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(parameterFields);
```
  1. 还是在 Not IsPostBack 条件块中,调用 defaultParameterValuesListListBox 的 DataBind() 方法。
``` vb
defaultParameterValuesList.DataBind()
```

``` csharp
defaultParameterValuesList.DataBind();
```

把从方法返回的 ArrayList 绑定到 Windows 项目中的 ListBox

  1. 在 ConfigureCrystalReports() 方法中,紧随获取 ParameterFields 实例的代码行之后,在代码中创建几行。
现在可在这几行中输入其它代码,设置当第一次加载页面时,defaultParameterValuesList ListBox 控件的数据源。
  1. 在这几行中,将 defaultParameterValuesList ListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,将 ParameterFields 实例作为方法参数传递。
``` vb
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(myParameterFields)
```

``` csharp
defaultParameterValuesList.DataSource =
GetDefaultValuesFromParameterField(parameterFields);
```

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

现在即可生成并运行项目,验证是否已经填充 defaultParameterValuesListListBox。

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

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

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

defaultParameterValuesListListBox 控件将显示默认值(在本教程中为城市)的完整列表。
  1. 返回到 Visual Studio,然后单击“停止”从调试模式中退出。