创建用户控件时,一般要创建公共事件。如果用户控件放在标准的 Visual Basic 窗体中,那么自定义事件会自动出现在窗体的代码模块中。
但是,对于 DataRepeater 控件来说,显露用户控件的事件并不是自动完成的。由于该用户控件并不是直接放在窗体上的,因此它的事件不会在代码模块中显露出来。但是有一种方法可以获得同样的效果。
简要地说,主要步骤如下:
注意 下面的按部就班过程是基于“使用 DataRepeater 控件 ”主题中创建的用户控件和 DataRepeater 控件工程进行的。
要创建用户控件显露的事件,请按照以下步骤执行:
Option Explicit
Public Event ProductChange()
Public Sub FireControlChange()
RaiseEvent ProductChange
End Sub
当在 DataRepeater 控件中使用 ProductsCtrl 用户控件时,ProductChange 事件就是 CtlEvents 显露的事件。
Option Explicit
Dim EventsObj As New CtlEvents
Public Property Get Events() As CtlEvents Set Events = EventsObj '
返回对CtlEvents
对象的引用End Property
Private Sub txtProductName_Change()
PropertyChanged ("ProductName")
EventsObj.FireControlChange
End Sub
要在容器窗体中显露用户控件的事件,请按照以下步骤执行:
下面的步骤适用于包含 DataRepeater 控件的工程。在这样的工程中,DataRepeater 控件所包含的用户控件具有根据上面步骤1至9创建的事件。
Option Explicit Dim WithEvents objRepCtl As CtlEvents '
确保使用了WithEvents
Private Sub DataRepeater1_RepeatedControlLoaded()
Set objRepCtl = DataRepeater1.RepeatedControl.Events
End Sub
由于可以在运行时设置 RepeatedControlName 属性,RepeatedControlLoaded是专门设计用来对只有加载控件之后才能初始化的控件设置属性的。
Private Sub objRepCtl_ProductChange()
Debug.Print "objRepCtl_ProductChange"
End Sub
为控件添加事件
通过简单地添加一些代码,可以很容易地为用户控件添加更多的事件。首先向类模块中添加公共事件,给每个想要引发的事件添加一个公共事件:
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