1

VB Express 2010. 创建了 PictureBox 的棋盘格 - Dim Board(64) as PictureBox 接下来,为每个正方形分配一个图像 - 类似于每一行:

For x = 1 to 64
    If (x Mod 2 = 1) then 
        Board(x).Image = My.Resources.wsquare
    Else
        Board(x).Image = My.Resources.bsquare

然后将正方形放在 FormI 上并将 .tag 属性 = 分配给索引,如下所示:

For x = 1 to 64
    Board(x).Location = New Point(y,x1)
    Me.Controls.Add(Board(x))
    Board(x).tag = x
    .....parameters for location y, x1 incremented as necessary....
Next

所有这一切都很好,并产生了棋盘格。 现在我需要知道单击正方形时的索引或标签。我不确定在代码中如何或在何处创建 EventHandler 以及如何在后续方法中引用索引或标记。以下是错误的,但我正在尝试。 Board.Click 不是数组的事件非常感谢一些代码示例或说明来解决我的困境。在这方面很新。提前致谢

Private Sub Clicked()
    AddHandler Board.Click, New EventHandler(AddressOf Board_Click)
End Sub

Private Sub Board_Click()

End Sub
4

2 回答 2

0

我认为您非常接近;您似乎被挂断的一点是,事件处理程序需要绑定到数组中的每个元素,Board而不是数组本身(这就是您想要做的,看起来像)。

这里有一些步骤可以帮助您入门....首先,我将修改此循环:

For x = 1 to 64
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

变成这样的东西:

For x = 1 to 64
    Board(x).Name = "Board_" + x.ToString()
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

所以我们使用 PictureBox 的Name属性来识别每个单独的 PictureBox。我们需要这个,以便您知道点击了哪个项目。

现在让我们为点击创建一个虚拟处理程序,例如:

Private Sub PictureBox1_Click(sender As Object, e As EventArgs)
    Dim clickedBox As PictureBox = CType(sender, PictureBox)

    MessageBox.Show(clickedBox.Name)
End Sub

在这里,我们只是从Click事件中获取单击的 PictureBox,将其转换为 PictureBox,然后发出其 Name 属性(记住我们之前设置过)。

所以现在我们有了这个,我们可以再次访问您的 For 循环并将处理程序绑定到数组中每个元素的单击事件,例如:

For x = 1 to 64
    Board(x).Name = "Board_" + x.ToString()
    AddHandler Board(x).Click, New EventHandler(AddressOf Me.PictureBox1_Click)
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

现在,如果您运行它,您应该会在单击 PictureBox 时看到一个显示“Board_23”或“Board_1”或类似内容的消息框。

现在要找出Board被点击元素的数组中的索引,您可以使用类似的东西,例如,SubstringReplace结合Convert来获取名称的数字部分。由于我们之前命名它的方式,名称的数字部分是数组索引。

PS。自从我做实际的 VB.NET 以来已经有一段时间了,但我认为数组是从零开始的,而不是从一开始的。我不确定,但你可能想在你的代码中检查一下(正如我所说,我有一段时间没有做过真正的 VB.NET)

于 2013-03-24T05:20:30.587 回答
0
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    For x = 0 To 16
        Board(x) = New PictureBox
        Board(x).Name = "Board_" + x.ToString()
        AddHandler Board(x).Click, New EventHandler(AddressOf Me.PictureBox1_Click)
        If (x Mod 2 = 1) Then
            Board(x).Image = My.Resources.green_bullet
        Else
            Board(x).Image = My.Resources.yellow_bullet
        End If
        Board(x).Location = New Point(Board(x).Width * x, 10)
        Me.Controls.Add(Board(x))
        Board(x).Tag = x
    Next x
End Sub
于 2014-08-28T09:35:28.057 回答