添加 Session 代码

在本节中,您将学习如何使用 Session 来保持针对报表排序顺序所做的更改。针对在设置项目(请参见“项目设置”)时创建的 ConfigureCrystalReports() 方法,需要添加代码,用于检查 Session 并在用户调整排序顺序后立即将报表实例重新加载到 Session 中。

向 ConfigureCrystalReports() 方法添加 Session 检查代码

  1. 在 ConfigureCrystalReports() 方法中的现有代码之前,创建一个 if/else 条件块,检查是否存在名为 hierarchicalGroupingReport 的 Session 对象。

    可以用任意标识符名称为这个 Session 对象命名。应使用唯一标识符,如报表实例的名称。

    If (Session("hierarchicalGroupingReport") Is Nothing) Then
    
    Else
    
    End If
    
    if(Session["hierarchicalGroupingReport"] == null)
    {
    }
    else
    {
    }
    
  2. 如果使用的是嵌入式报表,请将声明和实例化报表的代码行从其现有位置向上移动到 If 块中。

    If (Session("hierarchicalGroupingReport") Is Nothing) Then
    hierarchicalGroupingReport = New Hierarchical_Grouping()
    Else
    
    End If
    
    if (Session["hierarchicalGroupingReport"] == null)
    {
    hierarchicalGroupingReport = new Hierarchical_Grouping();
    }
    else
    {
    }
    
  3. 如果使用的是非嵌入式报表,请将用于声明并实例化报表并用于从目录路径加载报表的两行代码从其现有位置向上移动到 If 块中。

    Note注意

    此示例假设使用的是 Crystal Reports for Visual Studio 2008。如果使用另一个版本,请参见“示例报表目录”以确定示例报表的正确路径。

    If (Session("hierarchicalGroupingReport") Is Nothing) Then
    hierarchicalGroupingReport = New ReportDocument()
    hierarchicalGroupingReport.Load("C:\Program Files\Microsoft Visual Studio 9.0\Crystal Reports\Samples\chs\Reports\Feature Examples\Hierarchical Grouping.rpt")
    Else
    
    End If
    
    if(Session["hierarchicalGroupingReport"] == null)
    {
    hierarchicalGroupingReport = new ReportDocument();
    hierarchicalGroupingReport.Load("C:\Program Files\Microsoft Visual Studio 9.0\Crystal Reports\Samples\chs\Reports\Feature Examples\Hierarchical Grouping.rpt");
    }
    else
    {
    }
    
  4. 在 If 块中,使用报表变量名作为 Session 标识符字符串,将报表赋给 Session。

``` vb
Session("hierarchicalGroupingReport") = hierarchicalGroupingReport
```

``` csharp
Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport;
```

If 块的编写即告完成。If 块将在 Session 中没有报表时执行。如果 Session 中存在报表,则执行 Else 块;因此,Else 块的目的是要从 Session 中获取报表并使其成为报表实例。
  1. 在 Else 块内,将存储在 Session 中的报表赋给报表实例。
``` vb
hierarchicalGroupingReport = CType(Session("hierarchicalGroupingReport"), ReportDocument)
```

``` csharp
hierarchicalGroupingReport = (ReportDocument)Session["hierarchicalGroupingReport"];
```

<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>由于 Session 只返回一般对象,因此必须将报表转换为报表类型。无论是使用嵌入式还是非嵌入式报表,都要将获取的对象转换为 ReportDocument 类型。</p></td>
</tr>
</tbody>
</table>

在条件块之外和条件块下面,其余的代码将报表实例绑定到 CrystalReportViewer 控件的 ReportSource 属性。

正如“项目设置”说明的那样(请参见“项目设置”),每次重新加载页面时都会调用 ConfigureCrystalReports() 方法。因此,您对此方法的修改保证了总是获得和加载最新的报表(新的或存储在 Session 中的报表)。不过,目前还未编写任何代码,以真正更新报表实例。在下一节中,将实现在每次修改排序顺序后更新 Session 中的报表实例。

为 sortOrderDescending_Click 事件方法更新 Session 中的报表实例

  1. 在 sortOrderDescending_Click() 事件方法中,删除将 CrystalReportViewer 控件绑定到报表的最后一行代码。
这样将只留下更改排序顺序方向的三行代码。
  1. 在更改排序方向的三行代码之下,使用 ConfigureCrystalReports() 方法中所用的同一标识符将 hierarchicalGroupingReport 实例(已用新的排序顺序方向更新)赋给 Session。
<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>为简化操作,可以从 ConfigureCrystalReports() 方法中复制/粘贴这行代码。</p></td>
</tr>
</tbody>
</table>

``` vb
Session("hierarchicalGroupingReport") = hierarchicalGroupingReport
```

``` csharp
Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport;
```
  1. 最后,添加针对 ConfigureCrystalReports() 方法的调用,该方法会从 Session 中获取最新的 hierarchicalGroupingReport 实例(即刚才更新的实例),然后将其绑定到 CrystalReportViewer 控件。
``` vb
ConfigureCrystalReports()
```

``` csharp
ConfigureCrystalReports();
```

现在需要为第二个事件方法重复以上步骤。

为 sortOrderAscending_Click 事件方法更新 Session 中的报表实例

  1. 在 sortOrderAscending_Click() 事件方法中,删除将 CrystalReportViewer 控件绑定到报表的最后一行代码。

    这样将只留下更改排序顺序方向的三行代码。

  2. 在更改排序方向的三行代码之下,使用 ConfigureCrystalReports() 方法中所用的同一标识符将 hierarchicalGroupingReport 实例(已用新的排序顺序方向更新)赋给 Session。

为简化操作,可以从 ConfigureCrystalReports() 方法中复制和粘贴这行代码。

``` vb
Session("hierarchicalGroupingReport") = hierarchicalGroupingReport
```

``` csharp
Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport;
```
  1. 最后,添加针对 ConfigureCrystalReports() 方法的调用,该方法会从 Session 中获取最新的 hierarchicalGroupingReport 实例(即刚才更新的实例),然后将其绑定到 CrystalReportViewer 控件。

    ConfigureCrystalReports()
    
    ConfigureCrystalReports();
    

现在即可测试是否能够成功保持排序更改。