我正在创建一个国际象棋程序。它由64个图片框组成,交替出现黑白背景颜色
我已将它们命名为pba1
,pba2
,pbb1
,pbb2
,pbc1
,等等。
现在,我想仅通过黑色循环,例如,我只想循环,pba1,pbb2,pbc3等。
如何在VB.NET中为此创建循环?
我知道循环使用类似命名控件的方法,但我无法针对我的问题调整该方法。你能告诉我一个解决方案吗?
编辑:在pba1中,pb代表图片框,a1代表广场。为了以防万一,你想知道为什么这么一个名字。
编辑:查看此answer
答案 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