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

时间:2014-12-11 15:17:05

标签: arrays vb.net events event-handling eventhandler

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

这是我的代码:

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事件处理程序,这就是为什么它不在上面的代码中。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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移出循环)。此外,由于y在第一个循环中为0,因此您基本上在做一个0元素的ReDim(当y = 0时x * y = 0)

答案 1 :(得分:0)

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

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

在您的班级中使用WithEvents声明临时变量:

Public Class Form1

    Private WithEvents Tile As PictureBox

    ...

现在,在代码编辑器顶部的两个DropDowns中,将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一起使用的正确签名的方法。这对于没有标准签名的活动非常方便。