VB.NET如何对picturebox执行语句,其中.Name=var

VB.NET如何对picturebox执行语句,其中.Name=var,vb.net,runtime,Vb.net,Runtime,我在改造扫雷舰。我的所有代码都是在运行时创建的,请随时向c&p咨询以帮助解决问题 我有一个循环,它创建了一个带有随机地雷的PictureBox(pbxNewZone)网格,如果该框是地雷,则将标记设置为true,否则设置为false 我为一个名为“pbxNewZoneClicked”的点击事件直接播放这些图片盒(现在称为“pb”),并读取标签。到目前为止,它显示地雷用于测试目的,如果我根据标签的条件点击图片盒,它将显示命中地雷并清除img 现在,我需要能够点击一个图像,并检查周围的8个地雷IMG

我在改造扫雷舰。我的所有代码都是在运行时创建的,请随时向c&p咨询以帮助解决问题

我有一个循环,它创建了一个带有随机地雷的PictureBox(pbxNewZone)网格,如果该框是地雷,则将标记设置为true,否则设置为false

我为一个名为“pbxNewZoneClicked”的点击事件直接播放这些图片盒(现在称为“pb”),并读取标签。到目前为止,它显示地雷用于测试目的,如果我根据标签的条件点击图片盒,它将显示命中地雷并清除img

现在,我需要能够点击一个图像,并检查周围的8个地雷IMG。所有矿场均以其在网格上的x&y坐标命名(字面上基于form_load上创建的整数x和y),且以1为基础,这意味着第一个矿场的名称为“1,1”,而不是“0,0”

因此,如果我点击一个名为“8,7”的pb(重命名为directcasted picturebox),我将把xValueCheck和yValueCheck变量分别替换为“8”和“7”。然后,我将这两个值都减去一(以找到上方和左侧的框),Dim Box1作为String,在本例中为=“7,6”

这是我的逻辑。找到name=Box1的pb,如果该pb的Tag=True,则计数器+=1

当我没有点击pb时,如何在点击事件中检查pb的标签

以下是我目前得到的信息:

Public Class Form1
Inherits System.Windows.Forms.Form
Dim active As Boolean = True
Dim images(8) As Image 'declares image array

Dim zonesY As Integer = 9
Dim zonesX As Integer = 9

Dim Guy As Object
Dim pbxNewZone As PictureBox = DirectCast(Guy, PictureBox)  'declares pbxNewZone as a picturebox variable

Dim generator As New Random

Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    images(0) = Image.FromFile("clear.png")
    images(1) = Image.FromFile("1.png")
    images(2) = Image.FromFile("2.png")
    images(3) = Image.FromFile("3.png")
    images(4) = Image.FromFile("4.png")
    images(5) = Image.FromFile("5.png")
    images(6) = Image.FromFile("blank.png")
    images(7) = Image.FromFile("hit.png")
    images(8) = Image.FromFile("mine.png")

    Dim x As Integer  'declares x as an integer variable
    Dim y As Integer  'declares y as an integer variable
    Me.SuspendLayout()  'suspends creation of layout

    For y = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
        For x = 1 To zonesX  'starts a For loop (1 to zonesX number of loops)
            Dim zonesize1 As Integer
            Dim zonesize2 As Integer

            pbxNewZone = New PictureBox

            Dim blockStatus As Integer
            Dim allZones As Integer
            allZones = zonesX * zonesY
            blockStatus = generator.Next(0, allZones)

            pbxNewZone.Name = y & ", " & x
            If blockStatus < (allZones / 5) Then
                pbxNewZone.Tag = True
                If pbxNewZone.Tag = True Then
                    pbxNewZone.Image = images(8)
                End If
            Else
                pbxNewZone.Tag = False
                If pbxNewZone.Tag = False Then
                    pbxNewZone.Image = images(6)
                End If
            End If
            pbxNewZone.Height = 16
            pbxNewZone.Width = 16
            zonesize1 = pbxNewZone.Height 'sets out all of the boxes on the form.
            zonesize2 = pbxNewZone.Width
            pbxNewZone.Left = ((x - 1) * zonesize1 + 15)
            pbxNewZone.Top = ((y - 1) * zonesize2 + 15)
            Me.Controls.Add(pbxNewZone)
            '  Wire this control up to an appropriate event handler
            AddHandler pbxNewZone.Click, AddressOf pbxNewZoneClicked

        Next
    Next
    Me.Height = (pbxNewZone.Height * zonesY + 63)  'sets the height of fmmGame
    Me.Width = (pbxNewZone.Width * zonesX + 40)  'sets the width of frmGame

End Sub

Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)

    If active = True Then
        Dim pb As PictureBox = DirectCast(sender, PictureBox)

        Dim Status As String = "Clear" ' Status - Testing Purposes Only
        If pb.Tag = True Then ' Status - Testing Purposes Only
            Status = "Mine" ' Status - Testing Purposes Only
        End If
        MsgBox(pb.Name & vbCrLf & "Status: " & Status, , "Test") ' Post Statistics of box.

        Dim xValueCheck As Integer = pb.Name.Substring(0, 1)
        MsgBox(xValueCheck) ' To spit out y value from name
        Dim yValueCheck As Integer = pb.Name.Substring(3, 1)
        MsgBox(yValueCheck) ' To spit out y value from name

        Dim Box1 As String = (xValueCheck - 1) & ", " & (yValueCheck - 1)
        MsgBox("Box1 = " & Box1, , "Test")
        Dim count As Integer = 0

        If pb.Tag = True Then
            pb.Image = images(7) ' Hit Image
            active = False
            MsgBox("No Longer Active", , "Test") ' Testing Purposes Only
        ElseIf pb.Tag = False Then
            'ENTER CODE THAT WILL READ BOXES AROUND IT
            'ENTER CODE THAT WILL READ BOXES AROUND IT
            'ENTER CODE THAT WILL READ BOXES AROUND IT
            'ENTER CODE THAT WILL READ BOXES AROUND IT
            'ENTER CODE THAT WILL READ BOXES AROUND IT

            pb.Image = images(count) ' Clear Image by default.
        End If

    End If
End Sub

End Class
公共类表单1
继承System.Windows.Forms.Form
变暗激活为布尔值=真
将图像(8)作为图像“声明图像数组”
尺寸分区为整数=9
整数=9时的数值
作为对象的暗淡家伙
Dim pbxNewZone As PictureBox=DirectCast(Guy,PictureBox)'将pbxNewZone声明为PictureBox变量
作为新随机变量的Dim生成器
Public Sub Form1_Load(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
图像(0)=Image.FromFile(“clear.png”)
图像(1)=Image.FromFile(“1.png”)
图像(2)=Image.FromFile(“2.png”)
图像(3)=Image.FromFile(“3.png”)
图像(4)=Image.FromFile(“4.png”)
图像(5)=Image.FromFile(“5.png”)
图像(6)=Image.FromFile(“blank.png”)
图像(7)=Image.FromFile(“hit.png”)
images(8)=Image.FromFile(“mine.png”)
Dim x As Integer'将x声明为整数变量
Dim y As Integer'将y声明为整数变量
Me.SuspendLayout()'暂停布局的创建
For y=1 To zonesY'启动For循环(1 To zonesY循环数)
For x=1到zonesX'启动For循环(1到zonesX循环数)
Dim zonesize1作为整数
Dim zonesize2作为整数
pbxNewZone=新图片盒
将块状态设置为整数
将所有区域设置为整数
所有区域=区域ESX*区域Y
blockStatus=generator.Next(0,所有区域)
pbxNewZone.Name=y&“,”&x
如果区块状态<(所有区域/5),则
pbxNewZone.Tag=True
如果pbxNewZone.Tag=True,则
pbxNewZone.Image=images(8)
如果结束
其他的
pbxNewZone.Tag=False
如果pbxNewZone.Tag=False,则
pbxNewZone.Image=images(6)
如果结束
如果结束
pbxNewZone.Height=16
pbxNewZone.Width=16
zonesize1=pbxNewZone.Height'列出了表单上的所有框。
zonesize2=pbxNewZone.Width
pbxNewZone.Left=((x-1)*分区1+15)
pbxNewZone.Top=((y-1)*分区2+15)
Me.Controls.Add(pbxNewZone)
'将此控件连接到适当的事件处理程序
AddHandler pbxNewZone。单击,pbxNewZone的地址已选中
下一个
下一个
Me.Height=(pbxNewZone.Height*zonesY+63)“设置fmmGame的高度
Me.Width=(pbxNewZone.Width*zonex+40)设置frmGame的宽度
端接头
私有子pbxNewZoneClicked(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)
如果active=True,则
Dim pb作为PictureBox=DirectCast(发送方,PictureBox)
Dim状态为String=“Clear”'状态-仅用于测试目的
如果pb.Tag=True,则“状态-仅用于测试”
Status=“Mine”状态-仅用于测试目的
如果结束
MsgBox(pb.Name&vbCrLf&“Status:”&Status,“Test”)“发布框的统计信息。
Dim xValueCheck As Integer=pb.Name.Substring(0,1)
MsgBox(xValueCheck)“”从名称中吐出y值
Dim yValueCheck As Integer=pb.Name.Substring(3,1)
MsgBox(yValueCheck)“”从名称中吐出y值
尺寸框1为字符串=(xValueCheck-1)&“,”&(yValueCheck-1)
MsgBox(“Box1=“&Box1,“测试”)
Dim计数为整数=0
如果pb.Tag=True,则
pb.Image=图像(7)“命中图像”
活动=错误
MsgBox(“不再活动”、“测试”)“仅用于测试目的
ElseIf pb.Tag=False然后
'输入将读取其周围框的代码
'输入将读取其周围框的代码
'输入将读取其周围框的代码
'输入将读取其周围框的代码
'输入将读取其周围框的代码
pb.Image=images(count)'默认情况下清除图像。
如果结束
如果结束
端接头
末级

Yepes。请考虑使用2D数组来保存图片框。否则,您将需要一些(过于复杂的)反射代码来查找控件

二维阵列:

Private oGrid(10,10) As PictureBox

Private Sub SetupGrid() 
  '
  '  Initialize the grid here
  '
  '  Place the coordinate of the cell in the .Tag property.
  '
End Sub

Private Sub GridCellClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) 
  Dim tLocation As Point = sender.Tag
  '
  ' Scan around the other 8 cells
  '  eg.  oGrid(tLocation.X - 1, tLocation.Y)
  '
End Sub
当然,如果您创建一个新的用户控件来表示网格单元,那么所有这些额外的数据争用就变得容易多了