VB.Net 将处理程序添加到整个用户控件

VB.Net AddHandler to entire User Control

获得了一个设计有多个标签和图片框的用户控件。 现在我通过 Controls.Add 将这个 UserControl 集成到一个显示主 Form1 的面板中。

现在我喜欢在单击或悬停 UserControll 时引发事件。

如果我通过 AddHandler taskItem.MouseClick, AddressOf meClick 执行此操作,但它仅在我单击此用户控件的空 space 而不是标签或图片框上时触发。

目标是使用事件从标签中删除单击的 UserControl。

编辑:

这是我的用户控件的样子:

Public Class Taks
Private Sub Taks_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each childControl As Control In Controls
        AddHandler childControl.MouseClick, AddressOf Form1.meClick
    Next
End Sub


Public Sub AddTasks(ByVal task_label As TaskLabels, ByVal show_seperator As Boolean, ByVal task_subject As String, ByVal task_message As String)
    taskTitel.Text = task_subject
    taskDesc.Text = task_message

    If task_label = TaskLabels.General Then
        taskImage.Image = My.Resources.Information_50px
    End If
    If task_label = TaskLabels.Important Then
        taskImage.Image = My.Resources.Error_48px
    End If
    If task_label = TaskLabels.Critical Then
        taskImage.Image = My.Resources.Box_Important_50px
    End If

    BunifuImageButton1.Hide()

End Sub

Enum TaskLabels
    General = 0
    Important = 1
    Critical = 2
End Enum
End Class

这里我将 UserControl 集成到一个面板中

Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddTasks(Taks.TaskLabels.Critical, False, "Batterie Spannung", "low power")
    AddTasks(Taks.TaskLabels.Important, False, "Wetter", "Das Wetter hat sich verschlechtert, Wind > 15km/h")
    AddTasks(Taks.TaskLabels.General, False, "Server", "Auslastung liegt bei 12%")
    AddTasks(Taks.TaskLabels.Important, False, "Temperature", "Temperatur der Proben im Kritischen Bereich")

End Sub


Sub AddTasks(ByVal taksLabels As Taks.TaskLabels, ByVal task_sep As Boolean, ByVal taskTitle As String, ByVal TaskDesc As String, Optional ByVal toFront As Boolean = False)

    Dim taskItem As New Taks
    taskItem.AddTasks(taksLabels, task_sep, taskTitle, TaskDesc)

    taskItem.Dock = DockStyle.Top
    AddHandler taskItem.MouseClick, AddressOf meClick

    taskItem.Cursor = Cursors.Hand
    Panel1.Controls.Add(taskItem)
End Sub

Public Sub meClick(sender As Object, e As MouseEventArgs)

    If MessageBox.Show("delete Event?", "Question", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
        Panel1.Controls.Remove(sender)
    End If
    BunifuVScrollBar1.Maximum = Panel1.Height
End Sub

End Class

这就是活动的运作方式。这就像当您单击 Button 时表单不会引发 Click 事件一样。如果您希望 UC 在单击子控件时引发 MouseClick 事件,那么您需要在内部处理子控件的事件,然后自己引发 UC 的事件。例如

Public Class UserControl1

    Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each childControl As Control In Controls
            'Filter specific control types if desired.
            If TypeOf childControl Is Label OrElse TypeOf childControl Is Panel Then
                AddHandler childControl.MouseClick, AddressOf ChildControls_MouseClick
            End If
        Next
    End Sub

    Private Sub ChildControls_MouseClick(sender As Object, e As MouseEventArgs)
        Dim childControl = DirectCast(sender, Control)

        'Translate location on child control to location on user control.
        Dim translatedLocation = PointToClient(childControl.PointToScreen(e.Location))

        Dim args As New MouseEventArgs(e.Button,
                                       e.Clicks,
                                       translatedLocation.X,
                                       translatedLocation.Y,
                                       e.Delta)

        'Raise the event of the user control.
        OnMouseClick(args)
    End Sub

End Class