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