为了练习,我正在编写一个VB应用程序模拟和电梯系统,在建筑物中有4个电梯和40个楼层 - 当按下按钮时我希望它改变颜色,直到电梯到达那个楼层。
目前,我能想到的唯一方法是通过硬编码检查每个电梯所包含的目的地楼层列表,如果它包含给定的楼层,则更改该按钮的颜色,如下所示: / p>
' button 1
If elevator1.goingUpList.Contains(1) Or elevator1.goingDownList.Contains(1) Then
lift1Button1.BackColor = Color.LightGoldenrodYellow
ElseIf (elevator1.goingUpList.Contains(1) = False) Or (elevator1.goingDownList.Contains(1) = False) Then
lift1Button1.BackColor = DefaultBackColor
End If
问题在于,我必须为4个电梯中的每个电梯的每个按钮(总共40个)进行 - 160次必要的960行来完成相当简单的任务。这必须是一种更简单的方法吗?
我在考虑一个通过电梯列表的循环,检索列表中的每个楼层可能是一个更容易的解决方案 - 但我如何获得相应的按钮来改变颜色?
答案 0 :(得分:1)
是的,您可以使用For Each
循环来显示按钮。 Windows窗体具有Controls
Collection
属性。 Button
,Label
和TextBox
等所有控件都会添加到Contorls
Collection
,除非您使用的是Panel
,GroupBox
或其他容器。
在For Each
中使用Me.Controls
循环,所有类型的控件都将通过。因此,您必须使用TypeOf
运算符检查控件的类型。
如果您的表单有其他按钮而不是“电梯按钮”,则需要将“电梯按钮”的Tag
属性设置为“1”或电梯号码。
以下是示例代码
Dim ctl As Object
Dim elevatorNumber As String
Dim buttonNumber As String
For Each ctl In Me.Controls
If TypeOf ctl Is Button Then
elevatorNumber = ctl.Tag
buttonNumber = ctl.Text
If elevatorNumber = "1" Then
If elevator1.goingUpList.Contains(buttonNumber) Or elevator1.goingDownList.Contains(buttonNumber) Then
ctl.BackColor = Color.LightGoldenrodYellow
ElseIf (elevator1.goingUpList.Contains(buttonNumber) = False) Or (elevator1.goingDownList.Contains(buttonNumber) = False) Then
ctl.BackColor = DefaultBackColor
End If
End If
End If
Next