Arrays 如何响应数组中对象的事件

Arrays 如何响应数组中对象的事件,arrays,vb.net,events,event-handling,eventhandler,Arrays,Vb.net,Events,Event Handling,Eventhandler,我已经在一个数组中创建了一个瓷砖数组(pictureboxes),需要它们在单击时都执行一些操作,但不知道如何执行。具体地说,我希望能够通过单击一个平铺并使该对象转到该平铺的位置,在它们上放置一些其他对象。我知道您可能会建议查看mouseposition变量,并在所有平铺上放置一些不可见的框来注册单击,但我想知道如何为数组中的对象注册任何事件,以便将来出现任何事件。顺便说一下,我知道如何为不在数组中的对象注册事件。 我想在picturebox顶部移动的对象也将来自一个对象数组,但它是另一个数组

我已经在一个数组中创建了一个瓷砖数组(pictureboxes),需要它们在单击时都执行一些操作,但不知道如何执行。具体地说,我希望能够通过单击一个平铺并使该对象转到该平铺的位置,在它们上放置一些其他对象。我知道您可能会建议查看mouseposition变量,并在所有平铺上放置一些不可见的框来注册单击,但我想知道如何为数组中的对象注册任何事件,以便将来出现任何事件。顺便说一下,我知道如何为不在数组中的对象注册事件。 我想在picturebox顶部移动的对象也将来自一个对象数组,但它是另一个数组

这是我的密码:

Public Class Form1
    Dim tiles(50) As PictureBox 'This is the object array of tiles
    Dim plants() As String 'I haven't set this up yet, but this will be for the objects to be 'placed' on the pictureboxes.

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim tileWidth As Integer = 50
        Dim tileHeight As Integer = 50
        Dim xindent As Integer = 10
        Dim yindent As Integer = 10
        For x = 0 To 9
            For y = 0 To 4
                ReDim Preserve tiles(x * y)
                tiles(x * y) = New PictureBox With {.Visible = True, .Size = New System.Drawing.Size(50, 50), .Parent = Me, .BackColor = Color.GreenYellow, .Image = Nothing}
                tiles(x * y).Location = New System.Drawing.Point(x * tileWidth + xindent, y * tileHeight + yindent)
                If (x Mod 2 = 0 And y Mod 2 = 0) Or (x Mod 2 <> 0 And y Mod 2 <> 0) Then
                    tiles(x * y).BackColor = Color.Green
                End If
            Next
        Next
    End Sub
End Class
公共类表单1
将瓷砖(50)调暗为PictureBox'这是瓷砖的对象数组
Dim plants()作为字符串“我还没有设置它,但这将用于“放置”在pictureboxes上的对象。
私有子表单1_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
Dim tileWidth为整数=50
Dim tileHeight为整数=50
尺寸xindent为整数=10
Dim yindent作为整数=10
对于x=0到9
对于y=0到4
重读保留磁贴(x*y)
tiles(x*y)=新图片框,带有{.Visible=True、.Size=New System.Drawing.Size(50,50),.Parent=Me、.BackColor=Color.GreenYellow、.Image=Nothing}
瓷砖(x*y).位置=新系统.图纸.点(x*tileWidth+xindent,y*TileHight+yindent)
如果(x模2=0和y模2=0)或(x模2 0和y模2 0),则
瓷砖(x*y)。背景色=颜色。绿色
如果结束
下一个
下一个
端接头
末级
我只是不知道如何为tile数组设置click事件处理程序,所以上面的代码中没有

提前感谢您的帮助。

就是为了这个。在新事件之后,您只需要将函数附加到事件

AddHandler tiles(x * y).Click, AddressOf Tile_Click
Private Sub Tile_Click(sender As Object, e As System.EventArgs)

    ' sender represent the reference to the picture box that was clicked

End Sub
并具有处理事件的函数

AddHandler tiles(x * y).Click, AddressOf Tile_Click
Private Sub Tile_Click(sender As Object, e As System.EventArgs)

    ' sender represent the reference to the picture box that was clicked

End Sub

如果您已经知道阵列的大小,则应该只重新分配阵列一次,而不是每次循环(将重新分配移出循环)。另外,由于在第一个循环中y是0,因此基本上您正在进行0个元素的ReDim(当y=0时x*y=0)

莲花已经给了您一个很好的答案

我只是想和大家分享一个我在使用
AddHandler
连接事件时经常使用的技巧

在类中使用
with events
声明临时变量:

Public Class Form1

    Private WithEvents Tile As PictureBox

    ...
现在,在代码编辑器顶部的两个下拉列表中,将
Form1
更改为
Tile
,并将
(声明)
更改为
单击
(或任何您想要的事件)。这将为您输入具有正确方法签名的方法:

Private Sub Tile_Click(sender As Object, e As EventArgs) Handles Tile.Click

End Sub
删除
句柄磁贴。单击出现在第一行末尾的
部分:

Private Sub Tile_Click(sender As Object, e As EventArgs) 

End Sub
最后,删除使用
with events
的临时声明


现在您有了一个具有正确签名的方法,可以与
AddHandler
一起使用。这对于没有标准签名的活动来说非常方便。

谢谢,现在它更有意义了。但是,我不太清楚您重拨0个元素是什么意思,因为我使用括号中的内容作为要设置的对象的索引,而不是要设置的对象数。@TeeMee123查看循环中的第一次循环(x=0,y=0)。当您将它们相乘时,它等于0(redim减少数组长度,并且您正在索引0处创建一个新元素)。现在是第二遍(x=0,y=1)。当你乘以x*y=0*1时,它也将是0。第二遍也是一样(x=0,y=2)。@TeeMee123当(x=1,y=2)它将在索引2(xy=1*2=2)处创建一张新图片。但是当(x=2,y=1)的时候你会遇到一个问题,因为相乘的结果是2(xy=2*1=2)。