JH99
JH99

Reputation: 3

Streamlining event code in visual studio

I'm pretty new with VB and I was wondering if there was a better way to write the following code. I have 6 buttons across the top of my form that I have changing colors when the mouse enters and leaves them. Though, I couldn't figure out a way to do this without writing separate subs for each button, for each mouse movement. Any thoughts on shrinking this code? Thanks!

Private Sub Button1_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.MouseEnter
    Button1.ForeColor = Color.White
End Sub

Private Sub Button1_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.MouseLeave
    Button1.ForeColor = Color.Black
End Sub

Private Sub Button2_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.MouseEnter
    Button2.ForeColor = Color.White
End Sub

Private Sub Button2_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.MouseLeave
    Button2.ForeColor = Color.Black
End Sub

Private Sub Button3_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.MouseEnter
    Button3.ForeColor = Color.White
End Sub

Private Sub Button3_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.MouseLeave
    Button3.ForeColor = Color.Black
End Sub

Private Sub Button4_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.MouseEnter
    Button4.ForeColor = Color.White
End Sub

Private Sub Button4_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.MouseLeave
    Button4.ForeColor = Color.Black
End Sub

Private Sub Button5_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.MouseEnter
    Button5.ForeColor = Color.White
End Sub

Private Sub Button5_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.MouseLeave
    Button5.ForeColor = Color.Black
End Sub

Private Sub Button6_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.MouseEnter
    Button6.ForeColor = Color.White
End Sub

Private Sub Button6_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.MouseLeave
    Button6.ForeColor = Color.Black
End Sub

Upvotes: 0

Views: 42

Answers (1)

Andrew Morton
Andrew Morton

Reputation: 25023

You can have more than one Handles item, like this:

Private Sub Button_Enter(sender As Object, e As EventArgs) Handles _
    Button1.MouseEnter, Button2.MouseEnter, Button3.MouseEnter, Button4.MouseEnter, Button5.MouseEnter, Button6.MouseEnter

    Dim bn As Button = DirectCast(sender, Button)
    bn.BackColor = Color.White
End Sub

Private Sub Button_Leave(sender As Object, e As EventArgs) Handles _
    Button1.MouseLeave, Button2.MouseLeave, Button3.MouseLeave, Button4.MouseLeave, Button5.MouseLeave, Button6.MouseLeave

    Dim bn As Button = DirectCast(sender, Button)
    bn.BackColor = Color.Black
End Sub

Or you can assign the handlers through code, like this:

Private Sub Button_Enter(sender As Object, e As EventArgs)
    Dim bn As Button = DirectCast(sender, Button)
    bn.BackColor = Color.White
End Sub

Private Sub Button_Leave(sender As Object, e As EventArgs)
    Dim bn As Button = DirectCast(sender, Button)
    bn.BackColor = Color.Black
End Sub

Private Sub SetButtonHandlers()
    Dim bns() As Button = {Button1, Button2, Button3, Button4, Button5, Button6}
    For Each bn In bns
        AddHandler bn.MouseEnter, AddressOf Button_Enter
        AddHandler bn.MouseLeave, AddressOf Button_Leave
    Next

End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    SetButtonHandlers()

End Sub

The latter is easier to update if you were to add or remove buttons, or give them useful names, as they are listed in only one place.

Upvotes: 2

Related Questions