Brij
Brij

Reputation: 13129

Handle event of a User Control's control in a form

I have a Button in UserControl1. I am using UserControl1 in Form1. I want to handle Button's Click event in Form1.

I tried to do same via:

AddHandler userControl1.Button1.Click, AddressOf Button1_Click

And:

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

End Sub

but getting error.

Upvotes: 3

Views: 25317

Answers (2)

Chris Raisin
Chris Raisin

Reputation: 442

I found this very confusing until I placed the "AddHandler" in the main program (not the UserControl).

So for clarification, the steps to ensure that you can "sense" in the main program an event which has occurred in a user control is:

  1. Make sure any object in your user control for which you wish to alter properties (such as PictureBox.Image or TextBox.Text) has its modifier property set to "Public". This is the only way you can allow other programs to alter properties.

  2. For events which your want recognised (e.g. "Click","DblClick" etc.) place at the top of your User Control code one declaration line for a Public Event. As an example,

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

"UC_" is a prefix I use to help highlight that it is defined in a "UserControl". The rest of the name ("MySub") can be anything and does not need to relate to the Click Event in any way. You could even call it "CreamedCheese" if you want! Include any parameters you like the the definition of the public event, again they can be any type of name. These will be passed to the main program when you click on the User Control's object.

  1. Now, Going to the event which runs when you "click" on a GroupBox (in this case), you kick off that public event as shown here:

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

You have to ensure the parameters passed in this call to the public event are the same in number (and type) as each of the parameters defined in the Public Event declaration itself.

  1. NOW, you rebuild your User Object, then go to your main program. In the "Load" routine of your main Form, add the following line FOR EACH OBJECT of the user defined object you are using. For example, in my program I have 4 instances of my UDO (User Defined Object). So I have added (assuming my UDO is named "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
    

The "SwapHands" routine is defined in my main program and accepts the parameters stored in the UC Public event. The "AddressOf" points your resident subroutine. The only thing to ensure across all these definitions is that you have the same number of parameters (if you have any) in each case, in the same order, and are of the same type). (Each parameter can be a different type but must "line up" in types declared in each definition). (e.g. 1 Boolean, 1 String, another string). In the definitions and calls, there have to be (in this case) 3 parameters of "Boolean, String, String" - in that order.

Now when you run the program and click on the GroupBox (or whatever you have used) in your UDO (User defined object) (on any one of the four objects in this case), you will kick off the routine stored in your main program.

Hard to explain, but after taking HOURS to fathom how this works, I thought I would leave my comments in case others are experiencing the same confusion.

Upvotes: 0

SysDragon
SysDragon

Reputation: 9888

Create your event on the 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

And then use the new event:

AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click

Or you can simply define it like this on the UserControl and access to it from outside (not recommended):

Public WithEvents Button1 As System.Windows.Forms.Button

And then:

AddHandler uc.Button1.Click, AddressOf Button1_Click

Upvotes: 10

Related Questions