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

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

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

Note注意

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

若要执行该操作,必须添加和配置一个 ListBox 控件,然后创建一个帮助器方法来填充 ListBox 控件。

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

  1. 打开 Web 或 Windows 窗体。

  2. 从“视图”菜单中,单击“设计器”。

  3. 如果在开发网站,则执行以下操作:

    • 单击 CrystalReportViewer 控件,将其选中。
    • 在键盘上按左箭头,待出现闪烁的光标后,按 Enter 键。
CrystalReportViewer 控件将下移一行。
  1. 如果在开发 Windows 项目,则执行以下操作:

    • 单击 CrystalReportViewer 控件,将其选中。
    • 在“属性”窗口中,将“Dock”设置为“Bottom”。
      Note注意

      在 Visual Studio 中选择“Dock”属性时,将出现一个框架而不是选项列表。选择对应于“Bottom”的框架部分。

    • 调整 Windows 窗体和“CrystalReportViewer”控件的大小,使 CrystalReportViewer 足够大,能够显示报表。在“CrystalReportViewer”控件上方为“ListBox”控件留出空间。
    • 在“属性”窗口中,将“Anchor”设置为“Top, Bottom, Left, Right”。
    • 调整 Windows 窗体和“CrystalReportViewer”控件的大小,使 CrystalReportViewer 足够大,能够显示报表。在“CrystalReportViewer”控件上方为“ListBox”控件留出空间。
  2. 从“工具箱”中,将 ListBox 控件拖到 CrystalReportViewer 控件的上方。

<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>使用 Visual Studio 时,如果在 ListBox 上出现智能任务,请按 Esc 键关闭它。</p></td>
</tr>
</tbody>
</table>
  1. 单击 ListBox 控件选中它。

  2. 在“属性”窗口中执行以下操作:

    • 将“ID”或“Name”设置为“defaultParameterValuesList”。
    • 将“SelectionMode”设置为“Multiple”(在 Windows 项目中,设置为“MultiExtended”)。
  3. 从“文件”菜单中选择“全部保存”。

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

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

  1. 打开 Web 或 Windows 窗体。

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

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

``` vb
Private Function GetDefaultValuesFromParameterField(ByVal myReportDocument As ReportDocument) As ArrayList

End Function
```

``` csharp
private ArrayList GetDefaultValuesFromParameterField(ReportDocument reportDocument)
{
}
```
  1. 在 GetDefaultValuesFromParameterField() 方法中,从 ReportDocument 实例的 DataDefinition 属性获取 ParameterFieldDefinitions 索引类。
``` vb
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
```

``` csharp
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
```
  1. 从基于 PARAMETER_FIELD_NAME 常量的索引条目的 ParameterFieldDefinitions索引类中获取 ParameterFieldDefinition 实例。

    Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
    
    ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
    
  2. 从 ParameterFieldDefinition 实例的 DefaultValues 属性获取 ParameterValues 索引类(作为变量 defaultParameterValues)。

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

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

``` vb
For Each myParameterValue As ParameterValue In defaultParameterValues

Next
```

``` csharp
foreach(ParameterValue parameterValue in defaultParameterValues)
{
}
```

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

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

  1. 在 ConfigureCrystalReports() 方法中,紧随将“Tokyo”字符串值添加到 ArrayList 实例的代码之后创建几行。

    现在可在这几行中输入其它代码,设置当第一次加载页面时,defaultParameterValuesList ListBox 控件的数据源。

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

    If Not IsPostBack Then
    
    End If
    
    if(!IsPostBack)
    {
    }
    
    Note注意

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

  3. 在 Not IsPostBack 条件块中,将 defaultParameterValuesList ListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,并将 CustomersByCity 报表实例作为方法参数传递给该方法。

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

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

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

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

  1. 在 ConfigureCrystalReports() 方法中,紧随将“Tokyo”字符串值添加到 ArrayList 实例的代码之后创建几行。

    现在可在这几行中输入其它代码,设置当第一次加载页面时,defaultParameterValuesList ListBox 控件的数据源。

  2. 在这几行中,将 defaultParameterValuesList ListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,并将 CustomersByCity 报表实例作为方法参数传递给该方法。

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

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

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

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

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

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

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

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

在下一节中,将添加一个按钮,根据 defaultParameterValuesList ListBox 控件中的选择项重新显示报表。