2012-11-22 16 views
7

Sto provando a creare un ciclo foreach che controlli ogni TextBox in un pannello e cambi BackColor se il suo testo non è nulla. Ho provato la seguente:Per ogni loop della casella di testo

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

ma sto ottenendo l'errore:

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

+1

Se nel pannello sono presenti controlli di testo non di testo, è necessario accettarli. –

+0

Come potrei fare per farlo? – Lift

+0

possibile duplicato di [Impossibile lanciare l'oggetto di tipo 'System.Windows.Forms.Button' per digitare> 'System.Windows.Forms.TextBox'] (http://stackoverflow.com/questions/13002128/unable-to- cast-object-of-type-system-windows-forms-button-to-type-system-wi) –

risposta

8

si potrebbe provare qualcosa di simile a questo, invece:

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

Ha funzionato come un fascino! Grazie! – Lift

+0

Dovrai impostare il colore posteriore dopo aver digitato il testo, cosa che questo esempio non riesce a fare. –

+1

In questo particolare esempio, il condizionale potrebbe essere semplificato in 'Se (ctrl.GetType() è GetType (TextBox)) Quindi ctrl.BackColor = Color.LightYellow' ... – menssana

2

Prova questa. Sarà messo il colore indietro quando si immettono i dati così

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 

V'è anche un modo diverso di fare questo, che prevede la creazione di un controllo TextBox ereditato e l'utilizzo che sul modulo:

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

Ancora lancia la stessa eccezione, tuttavia, la risposta di cui sopra ha funzionato che era molto simile. Grazie comunque. – Lift

13

assumendo non ci sono controlli nidificati:

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

+1 per il spesso Ofeen Ofther (di T) ' – igrimpe

Problemi correlati