有没有办法简化这段代码?此处为 Visual Basic

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

我是 Visual Basic 的新手,这里的这段代码一直困扰着我。我想不出另一种方法来简化它。你能帮忙吗?谢谢!:

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

您需要将列表存储在某种集合中。这可以是数组或 List(Of PictureBox),或者如果所有控件都具有相同的父级,您可以简单地利用控件 属性.

集合就位后,您将需要迭代集合并使用 AddHandler 进行引用。在引用的方法中,您将获取发件人,并将其转换为 PictureBox。

这是一个假设所有 PictureBox 控件都在窗体上的示例:

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

以下是如何构建图片框列表,并“按顺序”排列它们,假设它们已经在表单中:

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

来自评论:

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

以下是打开 BorderStyle 后代码生成的内容: