在表单中处理用户控件控件的事件

时间:2013-01-30 12:24:42

标签: vb.net winforms events controls

我在UserControl1中有一个按钮。 我在UserControl1中使用Form1。 我想在Form1中处理Button的Click事件。

我尝试通过以下方式做同样的事情:

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

但是收到错误。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在我将“ AddHandler”放入主程序(而不是UserControl)之前,我感到非常困惑。

为澄清起见,确保可以在主程序中“感知”用户控件中发生的事件的步骤是:

  1. 确保用户控件中要更改其属性的任何对象(例如PictureBox.Image或TextBox.Text)的修改器属性都设置为“公共”。 这是允许其他程序更改属性的唯一方法。

  2. 对于您想要识别的事件(例如,“ Click”,“ DblClick”等)放置在用户控件代码顶部的一个公共事件声明行。例如,

         Public Event UC_MySub(.....parameters.....)
    

“ UC_”是我用来帮助强调它是在“ UserControl”中定义的前缀。 名称的其余部分(“ MySub”)可以是任何名称,并且无需以任何方式与Click事件相关。如果需要,您甚至可以将其称为“ CreamedCheese”! 包括您喜欢的公共事件定义的任何参数,同样,它们可以是任何类型的名称。当您单击用户控件的对象时,这些将被传递到主程序。

  1. 现在,转到当您“单击” GroupBox时运行的事件(在这种情况下),您将启动该公共事件,如下所示:

    Private Sub GroupBox_Click(sender As Object, e As EventArgs) Handles GroupBox1.Click
           RaiseEvent UC_MySub(....Paramaters.....)
    End Sub
    

您必须确保在此调用中传递给公共事件的参数的编号(和类型)与“公共事件”声明本身中定义的每个参数的编号(和类型)相同。

  1. 现在,您重建用户对象,然后转到主程序。 在主窗体的“加载”例程中,为您使用的用户定义对象添加“ FOR FOR EACH OBJECT”行。 例如,在我的程序中,我有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个参数“ Boolean,String,String”(按此顺序)。

现在,当您运行程序并在UDO(用户定义的对象)(在这种情况下为四个对象中的任何一个)上单击GroupBox(或使用过的任何对象)时,您将启动存储在其中的例程您的主程序。

很难解释,但是在花了HOURS来弄清楚这是如何工作之后,我想我会留下我的评论,以防其他人遇到同样的困惑。