Ir para o conteúdo
Furriel

[VB.NET 2003] Ciclo FOR???

Mensagens Recomendadas

Furriel    0
Furriel

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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,,,

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tiago Salgado    2
Tiago Salgado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Furriel    0
Furriel

:)

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tiago Salgado    2
Tiago Salgado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Furriel    0
Furriel

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Furriel    0
Furriel

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tiago Salgado    2
Tiago Salgado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tiago Salgado    2
Tiago Salgado

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tiago Salgado    2
Tiago Salgado

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 :)

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade