Darp mosh
Darp mosh

Reputation: 1

Is there a way to simplify this code? Visual Basic Here

I'm a newbie to Visual Basic and I have this code over here that's been bugging me. I can't think of another way to simplify this. Can you please help? Thanks!:

Private Sub PictureBox_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click,
PictureBox2.Click, PictureBox3.Click, PictureBox4.Click, PictureBox5.Click, PictureBox6.Click,
PictureBox7.Click, PictureBox8.Click, PictureBox9.Click, PictureBox10.Click, PictureBox11.Click,
PictureBox12.Click, PictureBox13.Click, PictureBox14.Click, PictureBox15.Click, PictureBox16.Click,
PictureBox17.Click, PictureBox18.Click, PictureBox19.Click, PictureBox20.Click, PictureBox21.Click,
PictureBox22.Click, PictureBox23.Click, PictureBox24.Click, PictureBox25.Click, PictureBox26.Click,
PictureBox27.Click, PictureBox28.Click, PictureBox29.Click, PictureBox30.Click, PictureBox31.Click,
PictureBox32.Click, PictureBox33.Click, PictureBox34.Click, PictureBox35.Click, PictureBox36.Click,
PictureBox37.Click, PictureBox38.Click, PictureBox39.Click, PictureBox40.Click, PictureBox41.Click,
PictureBox42.Click, PictureBox43.Click, PictureBox44.Click, PictureBox45.Click, PictureBox46.Click,
PictureBox47.Click, PictureBox48.Click, PictureBox49.Click, PictureBox50.Click, PictureBox51.Click,
PictureBox52.Click, PictureBox53.Click, PictureBox54.Click, PictureBox55.Click, PictureBox56.Click,
PictureBox57.Click, PictureBox58.Click, PictureBox59.Click, PictureBox60.Click, PictureBox61.Click,
PictureBox62.Click, PictureBox63.Click, PictureBox64.Click
        ...............
        ............... (stuff is down here.)
        ............... 
        ............... 

End Sub

Upvotes: 0

Views: 146

Answers (2)

Idle_Mind
Idle_Mind

Reputation: 39132

Here's how to build a list of the pictureboxes, with them "in order", assuming they are already on the form:

Public Class Form1

    Private PBs As New List(Of PictureBox)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For i As Integer = 1 To 64
            Dim ctlName As String = "PictureBox" & i
            Dim ctl As Control = Me.Controls.Find(ctlName, True).FirstOrDefault
            If Not IsNothing(ctl) AndAlso TypeOf ctl Is PictureBox Then
                Dim pb As PictureBox = DirectCast(ctl, PictureBox)
                AddHandler pb.Click, AddressOf PB_Click
                PBs.Add(pb)
            Else
                MessageBox.Show("Unable to find " & ctlName)
            End If
        Next
    End Sub

    Private Sub PB_Click(sender As Object, e As EventArgs)
        Dim pb As PictureBox = DirectCast(sender, PictureBox)
        ' ... do something with pb ...
    End Sub

End Class

From the comments:

Wait a minute, how do I do For Each pb In Controls.OfType(Of PictureBox)() AddHandler pb.Click, AddressOf pb_Click Next But for a List(Of Picturebox) named "Formula"?

For Each pb As PictureBox in Formula
    AddHandler pb.Click, AddressOf pb_Click
Next

Here's what you code produces after turning on the BorderStyle:

enter image description here

Upvotes: 0

David
David

Reputation: 6111

You will need to store the lists in a collection of some sort. This can either be an array or a List(Of PictureBox) or if all of the controls have the same parent you can simply leverage the Controls property.

Once you have the collection in place, you will need to iterate over collection and use AddHandler to reference. Inside the referenced method, you would get the sender, and convert it to a PictureBox.

Here is an example assuming all the PictureBox controls are on the Form:

Private Sub Form1_Load(sender As Object, e As EventArgs)
    For Each pb In Controls.OfType(Of PictureBox)()
        AddHandler pb.Click, AddressOf pb_Click
    Next
End Sub

Private Sub pb_Click(sender As Object, e As EventArgs)
    Dim pb = DirectCast(sender, PictureBox)
    ' pb is the control that was clicked
End Sub

Upvotes: 1

Related Questions