SlicedBread SlicedBread - 1 year ago 60 Question

Clicking a panel will trigger the containing label's click event

I made a custom calendar and and I'm having a bit of trouble. As the title suggests, I want to trigger click event when I click its panel. Here's my code.

Click Event:

Private Sub label_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m1.Click, m2.Click, m3.Click, m4.Click, m5.Click, m6.Click, tu1.Click, tu2.Click, tu3.Click, tu4.Click, tu5.Click, tu6.Click, w1.Click, w2.Click, w3.Click, w4.Click, w5.Click, w6.Click, th1.Click, th2.Click, th3.Click, th4.Click, th5.Click, th6.Click, f1.Click, f2.Click, f3.Click, f4.Click, f5.Click, f6.Click, sa1.Click, sa2.Click, sa3.Click, sa4.Click, sa5.Click, sa6.Click, su1.Click, su2.Click, su3.Click, su4.Click, su5.Click, su6.Click

Dim clickedLabel = TryCast(sender, Label)
If clickedLabel IsNot Nothing Then
If clickedLabel.ForeColor = Color.Black Then Exit Sub
clickedLabel.ForeColor = Color.Green
End If
End Sub

Photo for clarity

Answer Source

Here's an example. You may need to tweak the code to find the label.

Private Sub panel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim panel = CType(sender, Panel)
    Dim label = panel.Controls.OfType(Of Label).Single
    label_Click(label, e)
End Sub

Here's an example of dynamically attaching the handlers. Once again you'll need to tweak the code to find the panels / labels but it'll save you having to add all the handles clauses.

Private Sub AddHandlers()
    For Each panel In Me.Controls.OfType(Of Panel)()
        Dim label = panel.Controls.OfType(Of Label).Single
        AddHandler panel.Click, AddressOf panel_Click
        AddHandler label.Click, AddressOf label_click

End Sub