2012-11-22 127 views
7

我想做一個foreach循環,檢查面板中的每個文本框,並更改BackColor,如果它的文本是什麼。我已經試過如下:對於每個文本框循環

Dim c As TextBox 
For Each c In Panel1.Controls 
    if c.Text = "" Then 
    c.BackColor = Color.LightYellow 
    End If 
Next 

,但我得到的錯誤:

Unable to cast object of type System.Windows.Forms.Label to type System.windows.forms.textbox

+1

如果面板中有非文本框控件,則需要考慮它們。 –

+0

我該怎麼做呢? – Lift

+0

可能重複的[無法將'System.Windows.Forms.Button'類型的對象轉換爲類型>'System.Windows.Forms.TextBox'](http://stackoverflow.com/questions/13002128/unable-to- cast-object-of-type-system-windows-forms-button-to-type-system-wi) –

回答

8

你可以嘗試這樣的事情,而不是:

Dim ctrl As Control 
    For Each ctrl In Panel1.Controls 
    If (ctrl.GetType() Is GetType(TextBox)) Then 
     Dim txt As TextBox = CType(ctrl, TextBox) 
     txt.BackColor = Color.LightYellow 
    End If 
+0

工作就像一個魅力!謝謝! – Lift

+0

您需要在輸入文字後重新設置背景顏色,本例無法實現。 –

+1

在這個特殊的例子中,條件可以被簡化爲'If(ctrl.GetType()GetType(TextBox))然後ctrl.BackColor = Color.LightYellow' ... – menssana

2

試試這個。它會把色彩回來時,你輸入的數據以及

For Each c As Control In Panel1.Controls 
     If TypeOf c Is TextBox Then 
      If c.Text = "" Then 
       c.BackColor = Color.LightYellow 
      Else 
       c.BackColor = System.Drawing.SystemColors.Window 
      End If 
     End If 
    Next 

還有一種不同的方式來做到這一點,涉及創建繼承TextBox控件和使用您的形式:

Public Class TextBoxCompulsory 
    Inherits TextBox 
    Overrides Property BackColor() As Color 
     Get 
      If MyBase.Text = "" Then 
       Return Color.LightYellow 
      Else 
       Return DirectCast(System.Drawing.SystemColors.Window, Color) 
      End If 
     End Get 
     Set(ByVal value As Color) 

     End Set 
    End Property 
End Class 
+0

然而,拋出了相同的異常,但是,上面的答案工作非常相似。不管怎麼說,多謝拉。 – Lift

13

假設沒有出現任何嵌套控件:

For Each c As TextBox In Panel1.Controls.OfType(Of TextBox)() 
    If c.Text = String.Empty Then c.BackColor = Color.LightYellow 
Next 
+2

+1爲經常監督'OfType(Of T )' – igrimpe