handles 语法既是 VB.NET 的一个方便的功能,也可以是一个拐杖。对于简单的应用程序,它可以正常工作,但正如您所发现的,对于大型项目,它并不是最优雅的方法。
您可以使用几种方法。我在 cmets 中建议的是一种方法,如果你已经把自己逼到了一个角落,那么它可能有点小题大做。如果您还没有走得太远,您可以从更好的方法开始,那么理想情况下,您应该以编程方式创建您的PictureBoxes,而不是在设计时将它们拖放到您的表单上。像这样开发的习惯往往会在您的应用程序中创建大量难以管理的代码。考虑首先创建一个类:
Private Class ConcertSeat
Inherits PictureBox
Private _row As Integer
Private _column As Integer
Public Property Row As Integer
Get
Return _row
End Get
Set(value As Integer)
_row = value
End Set
End Property
Public Property Column As Integer
Get
Return _column
End Get
Set(value As Integer)
_column = value
End Set
End Property
Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
MyBase.OnMouseEnter(e)
' do rollover
End Sub
Protected Overrides Sub OnMouseLeave(e As System.EventArgs)
MyBase.OnMouseLeave(e)
' etc
End Sub
End Class
这显然只是一个骨架类——你应该明白了。在上面的类中,您可能希望为翻转等加载和关联图像。所有组件共有的任何自定义行为。如果您将图像合并到上面的控件中,您显然还希望实现IDisposable 以确保在释放控件时清理图像。
您还可以添加属性以识别IsBooked,例如,甚至可以添加 ID 或交叉参考号以链接到已预订座位的人等。设计必须由您决定 - 您比我们更了解需求。
然后在您的表单上,无需拖放任何东西,只需
Private SeatList As New List(Of ConcertSeat)
Private Sub Form1_Load(sender As Object, e As EventArgs) _
Handles MyBase.Load
Dim I As Integer
Dim j As Integer
Dim newSeat As ConcertSeat
For I = 0 To 10
For j = 0 To 10
newSeat = New ConcertSeat
newSeat.Row = I
newSeat.Column = j
' AddHandler here does the same job as the Handles clause **!**
AddHandler newSeat.Click, AddressOf ClickImage
SeatList.Add(newSeat)
' Add Control To Form
' Assume here that you have added properties
' to the class that define the xDimension and
' yDimension of the image so that they are laid
' out in a grid on your form.
newSeat.Top = 10 + newSeat.yDimension * I
newSeat.Right = 10 + newSeat.xDimension * j
Me.Controls.Add(newSeat)
Next
Next
End Sub
这是一个非常粗略的想法,而且有点具体,但它应该概述可以让您的生活更轻松的方法类型。您甚至不必让座位继承自 PictureBox - 您可以将它们分开作为数据类和图像类,通过 Dictionary 或类似的东西链接。
当表单被销毁时,别忘了解开处理程序:
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) _
Handles MyBase.FormClosing
For Each seat In SeatList
RemoveHandler seat.Click, AddressOf ClickImage
Next
End Sub
忘记取消挂钩处理程序可以将对象固定在内存中并阻止垃圾收集器清理它们(造成内存泄漏)。