3

我有一个按钮UserControl1。我正在使用UserControl1. Form1我想处理 Button 的 Click 事件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

但得到错误。

4

2 回答 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
于 2013-01-30T12:37:27.623 回答
0

在我将“AddHandler”放在主程序(而不是 UserControl)中之前,我发现这非常令人困惑。

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

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

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

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

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

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

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

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

  1. 现在,您重建您的用户对象,然后转到您的主程序。在主窗体的“加载”例程中,为您正在使用的用户定义对象的每个对象添加以下行。例如,在我的程序中,我有 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 时间了解它是如何工作的之后,我想我会留下我的评论,以防其他人遇到同样的困惑。

于 2020-08-10T13:44:14.890 回答