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



我已经在一个数组中制作了一个图块(图片框)数组,需要它们在单击时都做一些事情,但不知道如何。具体来说,我希望能够通过单击磁贴并使该对象转到该磁贴的位置来在其上放置其他对象。我知道您可能会建议查看 mouseposition 变量并在所有瓷砖上放置一些不可见的框来记录点击,但我想知道如何为数组中的对象注册任何事件,以便将来出现的任何内容。顺便说一下,我确实知道如何为不在数组中的对象注册事件。我想在图片框顶部移动的对象也将来自对象数组,但

不同。

这是我的代码:

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

我根本不知道如何为瓷砖数组设置 click 事件处理程序,所以这就是为什么它不在上面的代码中。

提前感谢您的帮助。

AddHandler就是为此而存在的。在 New 之后,您只需要将一个函数附加到事件中

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

如果您已经知道数组的大小,则应只对数组进行一次 ReDim 处理,而不是每次循环(将 ReDim 移出循环)。此外,由于 y 在第一个循环中为 0,因此您基本上是在执行 0 个元素的 ReDim(当 y = 0 时 x*y = 0)

the_lotus已经给了你一个很好的答案。

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

在类中使用WithEvents声明一个临时变量:

Public Class Form1
    Private WithEvents Tile As PictureBox
    ...

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

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

删除第一行末尾显示的Handles Tile.Click部分:

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

最后,删除使用 WithEvents 的临时声明。

现在,您已经获得了一个具有正确签名的方法,可以将其与AddHandler一起使用。 这对于没有标准签名的事件非常方便。

相关内容

  • 没有找到相关文章

最新更新