【问题标题】:Can you link an array variable with a control?您可以将数组变量与控件链接吗?
【发布时间】:2020-09-09 10:38:28
【问题描述】:

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

【问题讨论】:

  • 将您的数组分配给公共字段是不明智的。无论你打算用它做什么,都不要。仅在该表单内使用数组。如果您需要从外部启动对该数组的处理,请提供一个可以调用的公共方法,然后在该方法中使用该数组。
  • 也许有人想在他的回答中包含一个关于这个tile.BackgroundImage = My.Resources.g1774的词。让它完美:)
  • @JQSOFT,我本来是想提这个的,但可能不是因为你的意思。这并不是问题的症结所在,因此并不真正属于答案,但确实值得一提。首先,我猜您指的是几乎可以肯定该代码应该设置Image 属性而不是BackgroundImage 属性的事实。不知道为什么这么多人似乎犯了这个错误,但这肯定至少部分是由于缺乏尽职调查,即他们显然没有费心阅读PictureBox控制。
  • 我的另一点是代码几乎肯定不应该一遍又一遍地使用那些My.Resources 属性。这样做每次都会创建一个新的image 对象,这是资源密集型的,几乎可以肯定不需要。相反,这些属性应该只使用一次,并将结果分配给变量,并且这些变量多次使用。这样,代码会创建两个 Image 对象,而不是其中的 825 个。
  • 由于您已经硬编码了瓷砖数量 - 使用 TableLayoutPanel 和所需数量的单元格(瓷砖)和 PictureBox 在其中控制。

标签: arrays vb.net winforms controls picturebox


【解决方案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

【讨论】:

    【解决方案2】:

    永远不要在 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,并且您需要非常具体的类型名称。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多