我已经在一个数组中制作了一系列瓷砖(图片框),并且需要它们在点击时做所有事情,但不知道如何做。具体来说,我希望能够通过单击一个图块并使该对象转到该图块的位置来在其上放置一些其他对象。我知道你可能会建议查看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事件处理程序,这就是为什么它不在上面的代码中。
提前感谢您的帮助。
答案 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
一起使用的正确签名的方法。这对于没有标准签名的活动非常方便。