你能link一个带控件的数组变量吗?

Can you link an array variable with a control?

我正在制作一个带有 PictureBox 控件的程序。如果 PictureBox 控件已经在数组中,那么管理我想用 PictureBox 控件执行的操作将是最简单的。

这是我试过的。

Sub drawtiles()
    For x As Integer = 0 To 32 Step 1
        For y As Integer = 0 To 24 Step 1
            Dim tile As New PictureBox()
            tile.Width = 20
            tile.Height = 20
            tile.Top = y * 20
            tile.Left = x * 20
            tile.BackColor = Color.CornflowerBlue
            Dim r As Random = New Random
            ' Get random numbers between 1 and 3.
            ' ... The values 1 and 2 are possible.
            Dim s As Integer = (r.Next(1, 3))
            If s = 1 Then
                tile.BackgroundImage = My.Resources.g1774
            Else
                tile.BackgroundImage = My.Resources.rect881

            End If
            tiles(x)(y) = tile
            Controls.Add(tile)
        Next
    Next
End Sub

...在此处创建数组

Public Class Form1
    Public tiles As Array

那么,如何将 Picturebox 控件分配给 3d 数组值?

永远不要在 VB.Net 中使用 Array 作为类型名称。相反,您可以这样声明它:

 Public tiles() As PictureBox

或者这样:

Public tiles(32*24) As PictureBox

或者这个(可能是你最合适的):

Public tiles(32, 24) As PictureBox

或者这样:

Public tiles As New List(Of PictureBox)

或者完全跳过额外的数组,将控件放在 Panel 或 GroupBox 容器中,然后在需要查找它们时编写如下代码:

For Each tile As Picturebox in TilePanel.Controls.OfType(Of PictureBox)()
    ' ...
Next

请记住,随着向 .Net 生态系统的转移,VB 现在在强类型化的情况下工作得更好。 Option Strict 确实应该是 On,并且您需要非常具体的类型名称。

您几乎不应该将某些东西声明为 Array 类型。这实际上仅适用于您希望能够引用任何类型的数组的情况。这通常只发生在方法参数上,但是,自从泛型出现以来,您可以只编写一个泛型方法,其中泛型类型参数是数组的类型,例如

Private Sub ProcessArray(Of T)(array As T())
    For i = 0 To array.GetUpperBound(0)
        'Process element at index i here.
    Next
End Sub

如果你想要一个 PictureBoxes 的数组,那么创建一个 PictureBox 数组。此外,当您应该使用二维数组时,请勿使用锯齿状数组。这是 PictureBoxes:

的锯齿状数组
Private jaggedArrays As PictureBox()()

这是一个二维数组:

Private twoDimensionalArray As PictureBox(,)

区别在于第二个是单个对象,而第一个是包含多个一维数组的一维数组。

您应该像这样创建数组:

Private tiles(32, 24) As PictureBox

然后像这样填充它:

For i = 0 To tiles.GetUpperBound(0)
    For j = 0 To tiles.GetUpperBound(1)
        Dim tile As New PictureBox

        '...

        tiles(i, j) = tile
    Next
Next