【问题标题】:Is there a way to simplify this code? Visual Basic Here有没有办法简化这段代码?这里是 Visual Basic
【发布时间】:2021-01-17 20:42:08
【问题描述】:

我是 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),循环集合并将相同的处理程序分配给集合中的所有控件。引发事件时,sender 对象是引发事件的控件。只需将其转换为 PictureBox 即可访问其属性。
  • 我刚刚学会了如何动态制作图片框。但是,问题是,我不知道如何为集合中的所有控件动态分配相同的处理程序。
  • 在您的动态控件上使用AddHandler,就像大卫在下面的回答中显示的那样。

标签: vb.net simplify


【解决方案1】:

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

一旦你有了集合,你将需要遍历集合并使用 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

【讨论】:

  • 假设所有图片框都直接包含在表单中。如果 PictureBoxes 在不同的容器中,它将无法工作。
  • 它们直接包含在表单中。所以谢谢你。
  • 等一下,对于 Controls.OfType(Of PictureBox)() AddHandler pb.Click, AddressOf pb_Click Next 但对于名为“Formula”的 List(Of Picturebox),我该怎么做?
  • @Idle_Mind - 正确。就像我在帖子中所说的那样。
  • @Darpmosh - 将 Controls.OfType(Of PictureBox) 替换为 Formula
【解决方案2】:

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

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

来自cmets:

等一下,对于 Controls.OfType(Of PictureBox)() AddHandler pb.Click, AddressOf pb_Click Next But for a List(Of Picturebox) 命名为“公式”?

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

这是您在打开 BorderStyle 后的代码生成的内容:

【讨论】:

  • 我想动态地将图片框列表添加到表单中,而我当前的代码不起作用。这是我的代码: For i = 0 To 3 For j = 0 To 15 Dim PB As New PictureBox PB.Name = "PictureBox" + ((j + 1) + i * 16).ToString PB.Location = New Point(20 + 37 * i, 52 + 43 * j) PB.Tag = i.ToString + Convert.ToByte(j).ToString PB.Size = New Point(37, 43) Me.Controls.Add(PB) Next Next跨度>
  • 只需在循环中添加 AddHandler 调用:AddHandler PB.Click, AddressOf NameOfMethodHere
  • 嗯?在我当前的循环中,我不知何故无法将任何图片框添加到表单中。这是个问题
  • 您的代码正在添加图片框,但您可能只是看不到它们!尝试设置 BackColor 或 BorderStyle 属性以便您可以看到它们。
猜你喜欢
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多