循环通过VB.NET中的控件

时间:2012-06-23 02:31:41

标签: vb.net

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

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

编辑:在pba1中,pb代表图片框,a1代表广场。为了以防万一,你想知道为什么这么一个名字。

编辑:查看此answer

4 个答案:

答案 0 :(得分:5)

循环访问ControlCollection中的PictureBox并测试BackColor。我使用Form的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

根据您在答案中提供的其他信息,您的示例不起作用的原因是Controls Name是一个String,您将它与PictureBox控件进行比较而不是控件的名称。

您可以尝试使用Tag属性而不是控件的Name,它会更清晰,更易于阅读。我只是在PictureBox的标签属性中为黑色和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

答案 1 :(得分:4)

通过Forms Designer在设计时生成控件只对从窗体设计器中受益的布局有意义。

在你的情况下,你只有8个8行的64个统一框。不要使用Forms Designer,在运行时创建控件,不要给它们像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集合。

答案 2 :(得分: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等)。

答案 3 :(得分:0)

这很简单,可能资源很重,但它确实有效。我有一个包含36个CheckBoxes的表单。这利用了这样一个事实:当您复制一个复选框时,它只会增加名称的数量。我最终得到了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