创建显示默认参数的 ListBox 控件
本教程剩余的部分将介绍如何在 ListBox 控件中显示参数字段默认值的完整列表,以及如何根据在 ListBox 控件中所做的选择重新过滤报表内容。
在本节中,将学习如何用参数字段默认值填充 ListBox 控件。
注意 |
---|
您应记得在教程一开始创建此报表时即设置了“默认值”(一个较大的城市列表)。 |
若要执行该操作,必须添加和配置一个 ListBox 控件,然后创建一个帮助器方法来填充 ListBox 控件。
在窗体中创建和配置 ListBox 控件
打开 Web 或 Windows 窗体。
从“视图”菜单中,单击“设计器”。
如果在开发网站,则执行以下操作:
- 单击 CrystalReportViewer 控件,将其选中。
- 在键盘上按左箭头,待出现闪烁的光标后,按 Enter 键。
CrystalReportViewer 控件将下移一行。
如果在开发 Windows 项目,则执行以下操作:
- 单击 CrystalReportViewer 控件,将其选中。
- 在“属性”窗口中,将“Dock”设置为“Bottom”。
注意 在 Visual Studio 中选择“Dock”属性时,将出现一个框架而不是选项列表。选择对应于“Bottom”的框架部分。
- 调整 Windows 窗体和“CrystalReportViewer”控件的大小,使 CrystalReportViewer 足够大,能够显示报表。在“CrystalReportViewer”控件上方为“ListBox”控件留出空间。
- 在“属性”窗口中,将“Anchor”设置为“Top, Bottom, Left, Right”。
- 调整 Windows 窗体和“CrystalReportViewer”控件的大小,使 CrystalReportViewer 足够大,能够显示报表。在“CrystalReportViewer”控件上方为“ListBox”控件留出空间。
从“工具箱”中,将 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>
单击 ListBox 控件选中它。
在“属性”窗口中执行以下操作:
- 将“ID”或“Name”设置为“defaultParameterValuesList”。
- 将“SelectionMode”设置为“Multiple”(在 Windows 项目中,设置为“MultiExtended”)。
从“文件”菜单中选择“全部保存”。
现在即可创建从参数字段中获取默认值的帮助器方法。
创建从参数字段中获取默认值的帮助器方法
打开 Web 或 Windows 窗体。
从“视图”菜单中,单击“代码”。
在该类的底部,创建名为 GetDefaultValuesFromParameterField() 的新私有方法,它将返回 ArrayList 实例,且 ReportDocument 将被传递给该方法签名。
``` vb
Private Function GetDefaultValuesFromParameterField(ByVal myReportDocument As ReportDocument) As ArrayList
End Function
```
``` csharp
private ArrayList GetDefaultValuesFromParameterField(ReportDocument reportDocument)
{
}
```
- 在 GetDefaultValuesFromParameterField() 方法中,从 ReportDocument 实例的 DataDefinition 属性获取 ParameterFieldDefinitions 索引类。
``` vb
Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
```
``` csharp
ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
```
从基于 PARAMETER_FIELD_NAME 常量的索引条目的 ParameterFieldDefinitions索引类中获取 ParameterFieldDefinition 实例。
Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
从 ParameterFieldDefinition 实例的 DefaultValues 属性获取 ParameterValues 索引类(作为变量 defaultParameterValues)。
Dim defaultParameterValues As ParameterValues = myParameterFieldDefinition.DefaultValues
ParameterValues defaultParameterValues = parameterFieldDefinition.DefaultValues;
声明并实例化 ArrayList。
Dim myArrayList As ArrayList = New ArrayList()
ArrayList arrayList = new ArrayList();
创建一个 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 下有哪些属性可用:
如果可用属性为 IsRange,则在 foreach 循环中输入以下代码:
If (Not myParameterValue.IsRange) Then End If
if(!parameterValue.IsRange) { }
或者,如果可用属性为 Kind(DiscreteOrRangeKind,它是具有以下三个值的枚举类型:DiscreteValue、RangeValue、DiscreteAndRangeValue),则在 foreach 循环中输入以下代码:
If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then End If
if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue) { }
在此嵌套条件块中,将 ParameterValue 实例转换为其扩展类 DiscreteParameterValue。
Dim myParameterDiscreteValue As ParameterDiscreteValue = CType(myParameterValue, ParameterDiscreteValue)
ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue;
同样在此嵌套条件块中,将 ParameterDiscreteValue 实例的 Value 属性(已转换为字符串)添加到 ArrayList 实例中。
myArrayList.Add(myParameterDiscreteValue.Value.ToString())
arrayList.Add(parameterDiscreteValue.Value.ToString());
在条件块之外和 foreach 循环之外,并在方法的末尾,从该方法返回 ArrayList 实例。
Return myArrayList
return arrayList;
把从方法返回的 ArrayList 绑定到 Web 项目中的 ListBox
您已经从参数字段中获取了默认值,并作为 ArrayList 从方法中返回了这些值。现在要将此 ArrayList 绑定到 defaultParameterValuesList ListBox 控件。
根据是使用 Web 项目还是 Windows 项目,代码会略有不同;因此,确保仅完成下面的 Web 或 Windows 过程即可。
在 ConfigureCrystalReports() 方法中,紧随将“Tokyo”字符串值添加到 ArrayList 实例的代码之后创建几行。
现在可在这几行中输入其它代码,设置当第一次加载页面时,defaultParameterValuesList ListBox 控件的数据源。
在这几行中,创建 Not IsPostBack 条件块。
If Not IsPostBack Then End If
if(!IsPostBack) { }
注意 Not IsPostBack 条件块用于封装只应在首次加载页面时才运行的代码。在 Not IsPostBack 条件块中,控件通常都绑定到数据值,这样它们的数据值(以及所有后续控件事件)才不会在重新加载页面时重置。
在 Not IsPostBack 条件块中,将 defaultParameterValuesList ListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,并将 CustomersByCity 报表实例作为方法参数传递给该方法。
``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```
``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```
- 还是在 Not IsPostBack 条件块中,调用 defaultParameterValuesList ListBox 的 DataBind() 方法。
``` vb
defaultParameterValuesList.DataBind()
```
``` csharp
defaultParameterValuesList.DataBind();
```
把从方法返回的 ArrayList 绑定到 Windows 项目中的 ListBox
在 ConfigureCrystalReports() 方法中,紧随将“Tokyo”字符串值添加到 ArrayList 实例的代码之后创建几行。
现在可在这几行中输入其它代码,设置当第一次加载页面时,defaultParameterValuesList ListBox 控件的数据源。
在这几行中,将 defaultParameterValuesList ListBox 的 DataSource 属性设置为 GetDefaultValuesFromParameterField() 帮助器方法,并将 CustomersByCity 报表实例作为方法参数传递给该方法。
``` vb
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport)
```
``` csharp
defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport);
```
验证是否已经填充 defaultParameterValuesList ListBox 控件
现在即可生成并运行项目,验证是否已经填充 defaultParameterValuesList ListBox。
从“生成”菜单中选择“生成解决方案”。
如果生成过程中出错,请立即纠正。
从“调试”菜单中,单击“开始”。
defaultParameterValuesList ListBox 控件将显示默认值(在本教程中为城市)的完整列表。
- 返回到 Visual Studio,然后单击“停止”从调试模式中退出。
在下一节中,将添加一个按钮,根据 defaultParameterValuesList ListBox 控件中的选择项重新显示报表。