SlicedBread SlicedBread - 3 months ago 11
Vb.net 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

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
    Next

End Sub
Comments