2014-02-06 25 views
0

實踐中,我正在編寫一個VB應用程序,該應用程序模擬電梯系統,並在大樓中有4個電梯和40個樓層 - 按下按鈕時,我希望它改變顏色,直到電梯到達那層。Visual Basic - 使用循環更改按鈕顏色

目前我唯一能想到的方法是通過硬編碼檢查每個電梯的目的樓層列表,並且如果它包含給定的樓層,則更改該按鈕的顏色,如下所示:

' 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

開始通過動態地生成的接口。這將爲您提供對每個按鈕的編程訪問權限,而無需對控件ID進行硬編碼,也無需將控件硬編碼到可循環使用的數組。一旦你這樣做,你的可能性就打開了。 – ps2goat

+0

40個電梯按鈕既可以共享一個通用程序,也可以從按鈕中調用1或2個程序,如電梯,ElevatorUp和ElevatorDown,或者同時撥打 – Plutonix

+0

將問題降至3層和3部電梯。解決它,增加到5層和4部電梯。看看它是否仍然有效。如果沒有,請調整。注意模式,替換爲40層,你就完成了。 – Neolisk

回答

1

是的,你可以使用For Each循環爲你的按鈕。 Windows窗體具有ControlsCollection屬性。除非您使用Panel,GroupBox或其他容器,否則每個控件(如Button,LabelTextBox)都添加到該ContorlsCollection

通過使用For EachMe.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