在我将“AddHandler”放在主程序(而不是 UserControl)中之前,我发现这非常令人困惑。
因此,为了澄清起见,确保您可以在主程序中“感知”用户控件中发生的事件的步骤是:
确保用户控件中您希望更改其属性的任何对象(例如 PictureBox.Image 或 TextBox.Text)都将其修饰符属性设置为“Public”。这是允许其他程序更改属性的唯一方法。
对于您想要识别的事件(例如“Click”、“DblClick”等),请在您的用户控制代码的顶部放置一个公共事件的声明行。举个例子,
Public Event UC_MySub(.....parameters.....)
“UC_”是我用来帮助强调它是在“UserControl”中定义的前缀。名称的其余部分(“MySub”)可以是任何东西,不需要以任何方式与点击事件相关。如果你愿意,你甚至可以称它为“CreamedCheese”!包括任何你喜欢定义公共事件的参数,同样它们可以是任何类型的名称。当您单击用户控件的对象时,这些将被传递到主程序。
现在,转到当您“单击” GroupBox(在本例中)时运行的事件,您将启动该公共事件,如下所示:
Private Sub GroupBox_Click(sender As Object, e As EventArgs) Handles GroupBox1.Click
RaiseEvent UC_MySub(....Paramaters.....)
End Sub
您必须确保在此调用中传递给公共事件的参数在数量(和类型)上与在公共事件声明本身中定义的每个参数相同。
现在,您重建您的用户对象,然后转到您的主程序。在主窗体的“加载”例程中,为您正在使用的用户定义对象的每个对象添加以下行。例如,在我的程序中,我有 4 个 UDO(用户定义对象)实例。所以我添加了(假设我的 UDO 名为“MyUDO”):
AddHandler MyUDO1.UC_MySub, AddressOf SwapHands 'This is my sub accepting the values from the public event
AddHandler MyUDO2.UC_MySub, AddressOf SwapHands
AddHandler MyUDO3.UC_MySub, AddressOf SwapHands
AddHandler MyUDO4.UC_MySub, AddressOf SwapHands
“SwapHands”例程在我的主程序中定义,并接受存储在 UC Public 事件中的参数。“AddressOf”指向您的常驻子例程。在所有这些定义中唯一要确保的是,在每种情况下,您具有相同数量的参数(如果有的话),以相同的顺序,并且属于相同的类型)。(每个参数可以是不同的类型,但必须在每个定义中声明的类型中“排列”)。(例如 1 个布尔值、1 个字符串、另一个字符串)。在定义和调用中,必须有(在这种情况下)“布尔、字符串、字符串”的 3 个参数 - 按此顺序。
现在,当您运行程序并单击 UDO(用户定义对象)中的 GroupBox(或您使用过的任何东西)(在本例中为四个对象中的任何一个)时,您将启动存储在主程序中的例程.
很难解释,但在花了 HOURS 时间了解它是如何工作的之后,我想我会留下我的评论,以防其他人遇到同样的困惑。