2

我正在创建一个国际象棋程序。它由 64 个黑白背景颜色交替的画框组成。
我已将它们命名为pba1pba2pbb1pbb2pbc1
现在,我只想循环遍历黑色的,例如,我只想循环遍历 pba1、pbb2、pbc3 等。
如何在 VB.NET 中为此创建一个循环?

我知道循环通过类似命名的控件的方法,但我无法针对我的问题调整该方法。你能告诉我一个解决方案吗?

编辑:在 pba1 中,pb 代表图片框,a1 代表正方形。以防万一,你想知道为什么会有这样的名字。

编辑:看看这个答案

4

4 回答 4

6

循环遍历 ControlCollection 中的 PictureBox 并测试 BackColor。我使用了表单的 ControlCollection,如果它们在其他类型的容器控件中,请使用它。

For Each cntrl As Control In Me.Controls
    If TypeOf cntrl Is PictureBox Then
        If cntrl.BackColor = Color.Black Then
            'Do Something
        End If
    End If
Next

根据您在回答中提供的其他信息,您的示例不起作用的原因是控件名称是一个字符串,并且您将其与 PictureBox 控件而不是控件的名称进行比较。

您可以尝试使用TagProperty 而不是NameControl 的,它会更清晰,更易于阅读。我只是在 PictureBox 的标签属性中为黑色添加了 1,为白色添加了 0。

Private Sub OriginalColour()               
    For Each cntrl As Control In Me.Controls
        Dim result As Integer
        If TypeOf cntrl Is PictureBox Then
            If Integer.TryParse(cntrl.Tag.ToString, result) Then
                If result = 1 Then
                    cntrl.BackColor = Color.Gray
                Else
                    cntrl.BackColor = Color.White
                End If
            End If

        End If
    Next
End Sub
于 2012-06-23T03:15:50.893 回答
4

在设计时通过表单设计器生成控件只对受益于表单设计器的布局有意义。

在您的情况下,您只有 8 行 8 行中的 64 个统一框。不要为此使用表单设计器,在运行时创建控件,不要给它们命名pba1,只需将它们放入适当的数据结构中(例如 8x8 数组):

Private chessFields As PictureBox(8, 8)

' In Form_Load:
For i = 0 To 7
    For j = 0 To 7
        chessFields(i, j) = New PictureBox
        ' Set size, position … then, finally,
        Controls.Add(chessFields(i, j))
    Next
Next

这样,您可以有序地访问字段,而无需通过Form.Controls集合。

于 2012-06-23T10:06:11.017 回答
1

将所有图片框放在一个 8x8 的 tableLayoutPanel 中(也可用于缩放等)。然后

    For Each pb As PictureBox In TableLayoutPanel1.Controls
        Dim col As Integer = TableLayoutPanel1.GetCellPosition(pb).Column
        Dim row As Integer = TableLayoutPanel1.GetCellPosition(pb).Row
        If col Mod 2 = 0 Xor row Mod 2 = 0 Then
            pb.BackColor = Color.Black
        Else
            pb.BackColor = Color.White
        End If
    Next

当然,如果您有可用的正方形数组,您也可以使用它。

这不会影响事件(pba1.click 等)。

于 2012-06-23T09:56:59.927 回答
0

这相当简单,它可能会占用大量资源,但它确实有效。我有一个包含 36 个复选框的表单。这利用了这样一个事实,即当您复制复选框时,它只会增加名称的数量。我最终得到了 36 个名为 CheckBox1 到 Checkbox36 的复选框。该函数返回一个复选框,可用于设置或读取任何属性。

Private Function GetCheckBox(ByVal Index As Integer) As CheckBox
    Dim CKBox As checkbox
    For Each cntrl As Control In Me.Controls
        If TypeOf cntrl Is CheckBox Then
            CKBox = cntrl
            If CKBox.Name = "CheckBox" & Index Then
                Exit For
            End If
        End If
    Next
    Return ckbox
End Function
于 2015-02-10T19:26:21.073 回答