显露 RepeatedControl的用户控件事件

创建用户控件时,一般要创建公共事件。如果用户控件放在标准的 Visual Basic 窗体中,那么自定义事件会自动出现在窗体的代码模块中。

但是,对于 DataRepeater 控件来说,显露用户控件的事件并不是自动完成的。由于该用户控件并不是直接放在窗体上的,因此它的事件不会在代码模块中显露出来。但是有一种方法可以获得同样的效果。

简要地说,主要步骤如下:

  1. 在用户控件工程中添加类模块,并将模块取名为 CtlEvents。

  2. 在模块中添加名为 ProductChange 的公共事件。

  3. 在模块中添加名为 FireControlChange 公共过程,该过程触发 ProductChange 事件 (使用 RaiseEvent 语句)。

  4. 向用户控件中添加名为 Events的公共属性,该属性返回对 CtlEvents 对象的引用。

  5. 在用户控件各个组成控件的 Change 事件中调用 FireControlChange 过程以触发事件。

注意 下面的按部就班过程是基于“使用 DataRepeater 控件 ”主题中创建的用户控件和 DataRepeater 控件工程进行的。

要创建用户控件显露的事件,请按照以下步骤执行:

  1. 在 ActiveX Control 工程中添加一个类模块

  2. 将类模块的名称由 Class1 改为 CtlEvents

  3. 将实例的属性设置为 6GlobalMultiuse

  4. 在类模块的声明部分添加一个公共事件的声明。出于演示的目的,下面的代码只添加了一个事件的声明。在实际的应用程序中,可以为用户控件的每一个控件添加一个事件声明。
    Option Explicit
    Public Event ProductChange()
    
  5. 在类模块中添加一个公共过程。在该过程中,添加 RaiseEvent 语句以触发 ProductChange 事件。该过程在UserControl事件中被调用,其唯一目的就是触发事件。
    Public Sub FireControlChange()
    RaiseEvent ProductChange
    End Sub
    

    当在 DataRepeater 控件中使用 ProductsCtrl 用户控件时,ProductChange 事件就是 CtlEvents 显露的事件。

  6. 在用户控件对象的代码模块中,象下面这样,将一个变量类型声明为一个新的类:
    Option Explicit
    Dim EventsObj As New CtlEvents
    
  7. 向用户控件中添加一个公共的 Get 过程。在该过程中,使用 Set 语句返回对该对象的引用。
    Public Property Get Events() As CtlEvents
    Set Events = EventsObj ' 返回对 CtlEvents 对象的引用
    End Property
    
  8. 对于想监控的控件,在 Change 事件中调用这个类对象的过程:
    Private Sub txtProductName_Change()
    PropertyChanged ("ProductName")
    EventsObj.FireControlChange
    End Sub
    
  9. 保存并编译这个工程(生成 .ocx)。

要在容器窗体中显露用户控件的事件,请按照以下步骤执行:

下面的步骤适用于包含 DataRepeater 控件的工程。在这样的工程中,DataRepeater 控件所包含的用户控件具有根据上面步骤1至9创建的事件。

  1. 在包含 DataRepeater 控件的工程中,使用“部件”对话框向 Toolbox 中添加 ProductsCtl(ProductsCtl.ocx)。这一步是必要的,其目的是为了确保 Visual Basic 安装向导在工程中正确地包含了必需的.ocx 文件。同时,允许在设计时对 ProductsCtl 事件的代码进行访问。

  2. 在Form对象代码模块的 Declarations 部分中,粘贴下面这些代码,利用关键字 WithEvents 声明一个对象变量:
    Option Explicit
    Dim WithEvents objRepCtl As CtlEvents ' 确保使用了 WithEvents
    
  3. 在 DataRepeater 控件的 RepeatedControlLoaded 事件中设置变量为 Events 属性。必须使用 DataRepeater 控件的 RepeatedControl 属性设置变量,如下所示:
    Private Sub DataRepeater1_RepeatedControlLoaded()
    Set objRepCtl = DataRepeater1.RepeatedControl.Events
    End Sub

    由于可以在运行时设置 RepeatedControlName 属性,RepeatedControlLoaded是专门设计用来对只有加载控件之后才能初始化的控件设置属性的。

  4. 新对象 objRepCtl (连同事件)此时应该出现在“对象”框的下拉列表中,处于代码模块的左上角。从列表中选择对象,并在对象的事件中添加如下代码。
    Private Sub objRepCtl_ProductChange()
     Debug.Print "objRepCtl_ProductChange"
    End Sub
    
  5. 运行该工程,在改变 Products 字段时,将发生该事件。

为控件添加事件

通过简单地添加一些代码,可以很容易地为用户控件添加更多的事件。首先向类模块中添加公共事件,给每个想要引发的事件添加一个公共事件:

Option Explicit
Public Event ProductChange()
Public Event UnitPriceChange() ' <- 这是一个新的Event声明

接着在类模块的 FireControlChange 过程中添加一个参数。在该过程中添加一条 Select Case 语句以区别调用该过程的控件。通过该参数触发正确的事件:

Public Sub FireControlChange(ctlName As String)
   Select Case ctlName
   Case "ProductName"
      RaiseEvent ProductChange
   Case "UnitPrice"
      RaiseEvent UnitPriceChange
   Case Else
      ' 在此处理其他情况
   End Select
End Sub

最后,转到 UserControl 对象的代码模块。对于想要监控的控件,在 Change 事件中用正确的参数调用该过程,如下所示:

Private Sub txtProductName_Change()
   PropertyChanged "ProductName"
   EventsObj.FireControlChange "ProductName" ' 调用过程。
End Sub

Private Sub txtUnitPrice_Change()
   PropertyChanged "UnitPrice"
   EventsObj.FireControlChange "UnitPrice" ' 调用过程。
End Sub