在窗体中处理用户控件控件的事件

3

我在 UserControl1 中有一个按钮。

我在 Form1 中使用了 UserControl1

我想在 Form1 中处理按钮的单击事件。

我尝试通过以下方式实现:

AddHandler userControl1.Button1.Click, AddressOf Button1_Click

并且:

Public Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs) Handles userControl1.Button1.Click

End Sub

但是出现了错误。

8
你忘记复制粘贴错误信息了。 - Tim Schmelter
2个回答

10

UserControl上创建您的事件:

Public Class UserControl1

    Public Event UC_Button1Click()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent UC_Button1Click()
    End Sub

End Class

然后使用新事件:

AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click

或者你可以在UserControl上简单地这样定义,然后从外部访问它(不推荐):

Public WithEvents Button1 As System.Windows.Forms.Button

然后:

AddHandler uc.Button1.Click, AddressOf Button1_Click

为什么即使我已经将Button1声明为public,我们也不能简单地使用AddHandler userControl1.Button1.Click,AddressOf Button1_Click呢? - Brij
当然可以,但这并不推荐。我会编辑我的帖子。 - SysDragon
用户控件中子控件的默认可访问性为Friend。将其更改为Public需要在设计器中更改Modifiers属性。这不是一个很好的做法。 - Hans Passant

0

在我把"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(或您使用的任何其他对象中的任何一个)时,您将启动存储在主程序中的例程。
    很难解释,但在花费数小时来理解它如何工作后,我认为我会留下我的评论,以防其他人遇到同样的困惑。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接