Data Report事件

象标准的 Visual Basic 窗体一样,数据报表设计器的存在是由某些关键事件标记的。那些事件以及它们发生的顺序,如下表所示:

事件 描述
Initialize 查询完成之后发生,并且控件位于窗体上。
Resize 第一次显示设计器或一个对象的窗口状态更改时发生。
Activate 当设计器变为活动窗口时发生。
ProcessingTimeout 大约每秒钟发生一次,直到所有处理都已经结束。使用该事件可以决定处理是否占用太长时间,并取消处理。

注意 在查询完成之前该事件将不发生。请参阅下面的内容。

[Deactivate] 当设计器不再是活动窗口时发生。使用该事件决定用户是否单击了另一个窗体或设计器。
QueryClose 在设计器终止之前发生。设置 Cancel 参数为 True 以取消终止。CloseMode 参数返回引起终止的动作类型。
Terminate 当所有对设计器的引用都被设置为0时发生。

超时和异步调用事件

除设计器的存活期事件之外,DataReport 对象也以允许捕获错误和监视同步或异步函数调用的事件为特色。

ExportReport和PrintReport:查询、同步和异步处理

当调用 ExportReport 或 PrintReport 方法时,处理被分为三个阶段——查询、同步处理和异步打印或导出:

  1. 查询——当第一次创建数据报表时,发送给数据提供方一个查询。

  2. 处理——查询检索到的数据由 Visual Basic 处理以创建报表。数据被高速缓存在计算机上的一个临时文件中。这一处理是同步的。

  3. 异步打印或导出——在创建报表后,报表就被导出或打印。这一处理是异步的。

当Show方法被调用时,数据报表执行查询,然后在显示报表之前在同步处理过程中处理数据。

因为这些方法结合了同步和异步处理,有各自的事件监视每种处理。

ProcessTimeOut 事件——对于同步函数

处理一个大的数据报表也许要花费一些时间。如果想要允许您的用户取消过程较长的操作(如 Show、ExportReport 或 PrintReport),可以使用 ProcessingTimeout 事件监视已经过去了多少秒,并按照用户的命令把 cancel 参数设置为True。下面的代码显示了一个示例:

Private Sub DataReport_ProcessingTimeout(ByVal Seconds As Long, _
Cancel As Boolean, ByVal JobType As MSDataReportLib.AsyncTypeConstants, _
ByVal Cookie As Long)
   Select Case Seconds
   Case 30
      If MsgBox("This has taken " & Seconds & "seconds. Cancel?", _
         vbRetryCancel) = vbCancel Then
            Cancel = True
      End If
   Case 45
      If MsgBox("This has taken " & Seconds & "seconds. Cancel?", _
         vbRetryCancel) = vbCancel Then
            Cancel = True
      End If
   Case 60
      '60秒钟后自动取消。
      Cancel = True
   End Select
End Sub

注意 并不保证在上面指定的间隔会发生 ProcessingTimeout 事件。例如,在后台运行的其他的 Visual Basic 代码可能会阻止这一事件的发生。在那种情况下,将 Case 语句设置为一个范围内的值;当该事件发生时,将一个模块级标志设置为 True,并在随后发生的事件中检查它。

Error 事件——对于异步函数

要捕获在没有 Visual Basic 代码执行(也就是说,一个异步函数)时发生的错误,请使用 Error 事件。例如,如果 PrintReport 或 ExportReport 方法在异步阶段失败,Error 事件将发生。下面的示例捕获异步错误:

Private Sub DataReport_Error(ByVal JobType As _
MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, _
ByVal ErrObj As MSDataReportLib.RptError, ShowError As Boolean)
   Select Case JobType ' The JobType identifies the process.
   Case rptAsyncPrint
      ' 此处捕获 PrintReport 错误。
   Case rptAsyncReport
      ' 此处捕获 ExportReport 错误。
   End Select
End Sub

也可以使用 Error 事件捕获特定的情况,例如计算机上缺少打印机,如下面的代码中所示:

Private Sub DataReport_Error(ByVal JobType As _
MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, _
ByVal ErrObj As MSDataReportLib.RptError, ShowError As Boolean)
   Case rptErrPrinterInfo ' 8555
      MsgBox "A printing error has occurred. " & _
      "You may not have a Printer installed."
      ShowError = False
      Exit Sub
   Case Else
      ' 此处处理其他情况。
      ShowError = True
   End Select
End Sub

AsyncProgress 事件

AsyncProgress 事件不是为捕获错误而设计的,但允许监视异步函数的状态。到这一事件发生时,所有的数据都已经被处理过;这样,事件的两个参数是 PagesCompleted TotalPages。该事件还包括标识异步操作的参数:则 JobType Cookie 参数可以被用于监视任何处理的过程。