• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Furriel

[VB.NET 2003] Ciclo FOR???

13 mensagens neste tópico

Olá a todos,

Estava aqui a fazer uma pequena aplicação e surgiu-me uma dúvida que é o seguinte:

Tenho cerca de 40 checkBox e tenho uma que se estiver seleccionada, selecciona-as a todas se não não selecciona nenhuma.

No código tenho coisas parecidas com isto:

        Me.CheckBox1.Checked = False
        Me.CheckBox2.Checked = False
        Me.CheckBox3.Checked = False
        Me.CheckBox4.Checked = False
        Me.CheckBox5.Checked = False
        Me.CheckBox6.Checked = False
        Me.CheckBox7.Checked = False
        Me.CheckBox8.Checked = False
        Me.CheckBox9.Checked = False

A minha questão é, será que dá para fazer um ciclo For de forma a escrever menos linhas?

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Da forma que tens não me parece que seja possível porque não tens forma de criar um ciclo e ter um índice que possas usar na maneira que deste nomes aos controlos... Se criares um array de checkboxes. Ai já é possível fazer o que queres,,,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens duas soluções possiveis para resolveres isso consoante a tua situação.

1ª Situação - As checkboxes que o teu formulário tem são apenas as que vao ser seleccionadas, ou seja, nao tens mais checkboxes lá que nao queres q fiquem seleccionadas ao marcares a outra (suposta "Select All")

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        For Each ctrl As Control In Me.Controls
            If TypeOf ctrl Is CheckBox Then
                If Not DirectCast(ctrl, CheckBox).Text = "Select All" Then
                    DirectCast(ctrl, CheckBox).Checked = CheckBox1.CheckState
                End If
            End If
        Next
    End Sub

2ª Situação -Caso tenhas mais checkboxes no teu formulário e não queres que mudem o estado ao carregares no Select All, então aconselho-te a por as checkboxes que pretendes actualizar num groupbox por exemplo, e usas o seguinte codigo:

For Each ctrl As Control In Me.GroupBox1.Controls
            If TypeOf ctrl Is CheckBox Then
                If Not DirectCast(ctrl, CheckBox).Text = "Select All" Then
                    DirectCast(ctrl, CheckBox).Checked = CheckBox1.CheckState
                End If
            End If
        Next

NOTA: Para nao estares a marcares ou desmarcares a checkbox que actualiza as outras todas, eu pus esta linha  If Not DirectCast(ctrl, CheckBox).Text = "Select All" Then, mas tu podes alterar conforme o que pretendes.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:)

Obrigado, funcionou. Apenas fiz umas alterações, é que eu tenho a "Select All" dentro de uma TAB e as outras dentro de um Panel dentro dessa TAB.

Private Sub CheckBox43_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox43.CheckedChanged
        If (Me.CheckBox43.Checked = True) Then

            For Each ctrl As Control In Me.Panel1.Controls
                If TypeOf ctrl Is CheckBox Then
                    DirectCast(ctrl, CheckBox).Checked = True
                End If
            Next
        Else
            For Each ctrl As Control In Me.Panel1.Controls
                If TypeOf ctrl Is CheckBox Then
                    DirectCast(ctrl, CheckBox).Checked = False
                End If
            Next
        End If
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de ter a repetição do código do ciclo For. Em vez de fazeres um para o Checked = True e outro para o Checked = False, podes igualar o Checked ao estado da checkbox43.

DirectCast(ctrl, CheckBox).Checked = CheckBox43.Checked

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de ter a repetição do código do ciclo For. Em vez de fazeres um para o Checked = True e outro para o Checked = False, podes igualar o Checked ao estado da checkbox43.

Menos umas linhas :)

Obrigado mais uma vez.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma pergunta, o directcast é mesmo necessario? Que é que isso faz exactamente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma pergunta, o directcast é mesmo necessario? Que é que isso faz exactamente?

Por aquilo que li e verifiquei compara os tipos/estados de dois objectos.

aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, o DirectCast faz-te como indica o nome da função um Cast directo, atribuindo um tipo a um determinado objecto. Um exemplo prático onde utilizas isso é por exemplo a criação de um Evento para todos os objectos do mesmo tipo. Como indica na pagina que tiveste a ver, podes tambem usar o CType(). Ve este exemplo e ficarás a perceber melhor uma utilização pratica do CType ou do DirectCast.

http://weblogs.pontonetpt.com/tiagosalgado/posts/11420.aspx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu o CType sei usar e percebo, mas o DirectCast não :) e não vi nada no link que me indicaste que explicasse as diferenças.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como te disse, o CType e o DirectCast fazem o mesmo. No exemplo que te indiquei usei o CType mas podia ter usado o DirectCast. Por isso se percebes e sabes usar o CType, tb percebes e sabes usar o DirectCast.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como disse, nesta situação tanto podia usar um como outro, era igual. Mas o DirectCast tem a diferença de que precisas de ter o tipo herdado de outro. O site que indicaste tem uma melhor explicação, porque assim por palavras nao te consigo explicar bem. soz :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora