我正在制作一个带有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数组的值?
你几乎不应该将某些东西声明为类型 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
永远不要使用 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
而你想要非常具体的类型名称。