Jump to content

For each em um TabControl


jjmendes
 Share

Recommended Posts

Olá Pessoal

Necessito de uma ajuda. Estou tentando utilizar o for each para apagar alguns textbox e combobox de uma tabcontrol. Porém sem sucesso.

Segue o código:

Dim crtl As Control

For Each crtl In TabControl
            If crtl.Tag = "cab" Then
                crtl.Text = ""
            End If
        Next

Desde já, grato.

Link to comment
Share on other sites

Olá, bem-vindo.

Os TabControls são containers de TabPages, que por sua vez contêm os controlos.

Assim, não chega de forma alguma referires-te ao controlo. Terás de ir um pouco mais fundo na hierarquia:

        For Each P As TabPage In TabControl1.TabPages
            For Each ctrl As Control In P.Controls
                MsgBox(ctrl.Name & " - " & ctrl.GetType.ToString)
            Next
        Next

Literalmente, por cada tab que existir no tabcontrol e por cada controlo nessa tab, mostra-me o nome e tipo do que encontrares

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

ribeiro55

Fiz o teste aqui de acordo com o código que me passou, e já estou conseguindo chegar até as abas do tabcontrol.

Porém não consigo chegar até aos controles.

Os controles estão dentro de GroupBox. Potanto o código lê o GroupBox, mas não os controles.

Link to comment
Share on other sites

GroupBoxes também são containers. 😉

Temos de escavar ainda mais fundo:

(poderias alternativamente usar uma função recursiva)

        For Each P As TabPage In TabControl1.TabPages
            For Each ctrl As Control In P.Controls
                If TypeOf ctrl Is GroupBox Then
                    For Each subctrl As Control In ctrl.Controls
                        MsgBox(subctrl.Name & " - " & subctrl.GetType.ToString)
                    Next
                End If
            Next
        Next

Um aparte: se estás a apanhar Tabs (o objecto TabPage propriamente dito), alguma coisa estás a fazer mal.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Não deixam nada de "existir": só não pertencem à colecção de controlos do form.

Não deixam de funcionar: desde que tenham o handle até dentro de 1000 groupboxes e 500 tabcontrols funcionavam.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Nesse caso o que faz sentido é usar um ciclo recursivo, que irá percorrer todos os controlos.

Algo como:

     Sub ClearControls(ByVal ctrl As Control)
        For Each c As Control In ctrl.Controls

            If TypeOf c Is TextBox Then
                Dim tb As TextBox = DirectCast(c, TextBox)
                tb.Text = String.Empty
            ElseIf TypeOf c Is ComboBox Then
                Dim cb As ComboBox = DirectCast(c, ComboBox)
                cb.DataSource = Nothing
            End If

            If c.HasChildren Then
                ClearControls(c)
            End If

        Next

    End Sub

Depois só precisas de chamar:

ClearControls(Me)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.