[VB.Net] for each - Problem mit Steuerelementen

Ein_Freund

Erfahrenes Mitglied
Hallo liebe Gemeinde,

ganz einfaches Szenario:
Ich habe eine ASP.Net Webanwendung [VB.Net], in der sich einige TextBoxes befinden. Diesen sollen in manchen Situationen die Eigenschaft readOnly = False und in anderen Situationen eben readOnly = True zugewiesen werden. Um nun aber nicht jedes mal die einzelnen Steuerelemente angeben zu müssen, dachte ich an eine for each... Schleife - ungefähr so:

Code:
Dim txt As System.Web.UI.WebControls.TextBox
For Each txt In Me.Controls
      txt.ReadOnly = True
Next

Fehlermeldung: System.InvalidCastException: Die angegebene Umwandlung ist ungültig.

Na gut, dachte ich, dann eben anders und schaust mal, als was für ein Steuerelement genau dir die TextBox angegeben wird. Ich also eine Testanwendung erstellt, mit einem Button, einer TextBox und einer ListBox versehen und hinter den Button folgendes geschrieben:

Code:
Dim ctrl As Control
For Each ctrl In Me.Controls
      ListBox1.Items.Add(ctrl.GetType.ToString)
Next

Ausgabe:
System.Web.Ui.ResourceBasedLiteralControl
System.Web.Ui.HtmlControls.HtmlForm
System.Web.Ui.LiteralControl


Und dabei ist es auch egal, welche und wieviele Steuerelemente ich auf der Form plaziere.. Offensichtlich liegt der ganzen Geschichte eine Hirarchie zugrunde.

Kann mir da vielleicht jemand weiterhelfen?
 

Nico Graichen

Erfahrenes Mitglied
Hi,

Du musst rekursiv über die Controls laufen.
Jedes Control hat das Property Controls, mit dem du die "SubControls" abfragen kannst.
Pack die Schleife also in eine Funktion, die sich rekursiv aufruft und übergib immer das aktuelle Control
 

Ein_Freund

Erfahrenes Mitglied
Hallo niggo,

das war genau der Hinweis, den ich brauchte!

Für alle, die ein ähnliches Problem haben, hier meine Lösung:
Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ctrl As Control
        For Each ctrl In Me.Controls
            Call loopControls(ctrl)
        Next
End Sub

Private Sub loopControls(ByVal curControl As Control)
        Dim tmpControl As Control
        Dim txt As Web.UI.WebControls.TextBox
        For Each tmpControl In curControl.Controls
            If TypeOf (tmpControl) Is System.Web.UI.WebControls.TextBox Then
                txt = tmpControl
                txt.ReadOnly = True
            ElseIf tmpControl.HasControls Then
                loopControls(tmpControl)
            End If
        Next
End Sub

Vielen Dank...