【问题标题】:How can I respond to events raised by programmatically created UI elements?如何响应以编程方式创建的 UI 元素引发的事件?
【发布时间】:2013-04-06 20:37:30
【问题描述】:

我正在为一个课程作业创建一个棋盘游戏。对于棋盘,我使用一些嵌套的 For 循环在 2D 数组中运行,以在每个方格生成一个“Space”对象。

Space 对象包含一个图片框和一些关于该空间的数据。

如何处理由单击生成的图片框引起的事件,而不必为每个空间进行硬编码?

我注意到this 的问题似乎解决了这个问题,但它是用 C# 编写的,我无法将它翻译成 VB.Net。

编辑: 这就是板的生成方式

 Dim board(23, 24) As Space

 Private Sub GenerateBoard()

    Dim spaceSize As New Size(30, 30)
    Dim spaceLocation As New Point
    Dim validity As Boolean

    For Y = 0 To 24
        For X = 0 To 23
            spaceLocation.X = 6 + (31 * X)
            spaceLocation.Y = 6 + (31 * Y)

            If validSpaces(Y).Contains(X + 1) Then
                validity = True
            Else
                validity = False
            End If

            board(X, Y) = New Space(validity, spaceSize, spaceLocation)
            Me.Controls.Add(board(X, Y).imageBox)
            board(X, Y).imageBox.BackColor = Color.Transparent
            board(X, Y).imageBox.BringToFront()
        Next
    Next
End Sub

太空类:

Public Class Space

Dim _active As Boolean
Dim _imageBox As PictureBox

Public Sub New(ByVal activeInput As Boolean, ByVal size As Size, ByVal location As Point)
    _active = activeInput
    _imageBox = New PictureBox
    With _imageBox
        .Size = size
        .Location = location
        .Visible = False
    End With
End Sub

Property active As Boolean
    Get
        Return _active
    End Get
    Set(value As Boolean)
        _active = value
    End Set
End Property

Property imageBox As PictureBox
    Get
        Return _imageBox
    End Get
    Set(value As PictureBox)
        _imageBox = value
    End Set
End Property

Public Sub highlight()
    With _imageBox
        .Image = My.Resources.Highlighted_slab
        .Visible = True
    End With
End Sub
End Class

【问题讨论】:

  • 请随时分享您的尝试以及您的确切问题。没有人愿意为您做作业,但我们当然会帮助您解决实际问题。那么:什么不起作用?
  • @Mr.VVOO 好吧,我不知道如何解决这个问题。目前,我有 600 个以编程方式生成的图片框存储在 2D 数组中,并且无法处理来自它们的点击事件。我尝试创建一个事件来处理数组上的单击事件,但它不起作用(即:Sub space_Click(sender As Object, e As EventArgs) Handles board().Click)。我能想到的唯一其他“解决方案”是手动编写一个例程来处理每个图片框,这将异常低效。
  • 那么也许你应该提供一些代码,其他人可以看到从哪里以及如何开始。
  • 但它是用 C# 编写的,我无法将它翻译成 VB.Net。 C# 和 VB.NET 是由同一个团队开发的,所以它们几乎是一回事。和generatedControl.Click += generatedControl_ClickHandler; 在VB.NET 中AddHandler generatedControl.Click, AddressOf generatedControl_ClickHandler
  • @Fabio 好的,那会去哪里?就在我声明数组来保存它们之后,还是在我初始化空间之后?

标签: vb.net winforms visual-studio-2012


【解决方案1】:

首先由设计器创建的所有控件(文本框、标签...)也是由代码生成的,但 VisualStudio 会为您编写。如果你打开Designer文件(yourForm.Designer.vb),你可以看到所有代码如何生成一个控件。

如果您想要为您的 pictureBox 创建事件处理程序,那么:

//Initialize control
Private WithEvents _imageBox as PictureBox

然后创建一个事件处理方法:

Private Sub imageBox_Click(sender as Object, e as EventArgs)
    //Your code
End Sub

然后在 VB.NET 中,您可以通过两种方式将事件处理程序分配给事件

首先:在创建图片框后的类构造函数中(New PictureBox())添加

AddHandler Me._imageBox, AddressOf Me.imageBox_Click

second:在我们创建了一个事件处理程序的线上,添加下一个:

Private Sub imageBox_Click(sender as Object, e as EventArgs) Handles _imageBox.Click
    //Your code
End Sub

记得将你的图片框添加到表单控件YourForm.Controls.Add(spaceInstance.ImageBox)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多