象标准的 Visual Basic 窗体一样,数据报表设计器的存在是由某些关键事件标记的。那些事件以及它们发生的顺序,如下表所示:
事件 | 描述 |
Initialize | 查询完成之后发生,并且控件位于窗体上。 |
Resize | 第一次显示设计器或一个对象的窗口状态更改时发生。 |
Activate | 当设计器变为活动窗口时发生。 |
ProcessingTimeout | 大约每秒钟发生一次,直到所有处理都已经结束。使用该事件可以决定处理是否占用太长时间,并取消处理。
注意 在查询完成之前该事件将不发生。请参阅下面的内容。 |
[Deactivate] | 当设计器不再是活动窗口时发生。使用该事件决定用户是否单击了另一个窗体或设计器。 |
QueryClose | 在设计器终止之前发生。设置 Cancel 参数为 True 以取消终止。CloseMode 参数返回引起终止的动作类型。 |
Terminate | 当所有对设计器的引用都被设置为0时发生。 |
除设计器的存活期事件之外,DataReport 对象也以允许捕获错误和监视同步或异步函数调用的事件为特色。
当调用 ExportReport 或 PrintReport 方法时,处理被分为三个阶段——查询、同步处理和异步打印或导出:
当Show方法被调用时,数据报表执行查询,然后在显示报表之前在同步处理过程中处理数据。
因为这些方法结合了同步和异步处理,有各自的事件监视每种处理。
处理一个大的数据报表也许要花费一些时间。如果想要允许您的用户取消过程较长的操作(如 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,并在随后发生的事件中检查它。
要捕获在没有 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 事件不是为捕获错误而设计的,但允许监视异步函数的状态。到这一事件发生时,所有的数据都已经被处理过;这样,事件的两个参数是 PagesCompleted 和 TotalPages。该事件还包括标识异步操作的参数:则 JobType 和 Cookie 参数可以被用于监视任何处理的过程。