能否将数组变量与控件连接起来?

问题描述 投票:0回答:2

我正在制作一个带有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数组的值?

arrays vb.net winforms controls picturebox
2个回答
1
投票

你几乎不应该将某些东西声明为类型 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

1
投票

永远不要使用 Array 作为VB.Net中的类型名。相反,你会像这样声明它。

 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而你想要非常具体的类型名称。

© www.soinside.com 2019 - 2024. All rights reserved.