你能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
我正在制作一个带有 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