【问题标题】:How Can I Put An Array Into The Handles In A Form For VB.NET?如何将数组放入 VB.NET 表单中的句柄中?
【发布时间】:2014-08-22 02:03:32
【问题描述】:

我正在开发一个程序,它允许您通过单击/滚动一组图片框来选择要在音乐厅预订的座位,如下所示:

http://postimg.org/image/urhvij3xn/

我知道如何使所有这些图像都有翻转效果,但只是单独的,而不是作为一个数组。

最接近我拥有的允许我对所有图片框使用相同代码的解决方案是:

 Private Sub ClickImage(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox100.MouseClick, PictureBox101.MouseClick, PictureBox102.MouseClick

但这需要我将每个图片框都输入到句柄区域。有什么方法可以让我在句柄中输入一组图片框,然后使用 sender 命令检测哪个?

谢谢

【问题讨论】:

  • 你要使用的是AddHandler关键字。请参阅此示例:stackoverflow.com/a/12672042/327083 显然,您需要在示例中将 PictureBox 替换为 TextBox,但我认为这种方法正是您要寻找的。​​span>
  • 这是一项基本的 Winforms 编程任务,任何介绍性书籍或教程都会向您展示如何完成。最好的入门方法是找一把剪刀剪断鼠标脐带,这样你就不能再从工具箱中拖放控件了。

标签: vb.net image visual-studio-2010 picturebox handles


【解决方案1】:

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

忘记取消挂钩处理程序可以将对象固定在内存中并阻止垃圾收集器清理它们(造成内存泄漏)。

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多