Notifications
Clear all

Checkbox no Listview

11 Posts
2 Usuários
0 Reactions
4,029 Visualizações
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

Bom dia Pessoal,
tenho um código que filtra as linhas que estão selecionadas no checkbox do Listview, porem quando eu desativo o filtro os checkbox são desmarcados. Preciso fazer com que não seja desmarcado ao desativar o filtro. Por favor me ajudem. Segue o código que filtra no listview.

  Dim i As Long
    i = 1
Retorno:
    Do While i <= Me.lstvFiltro.ListItems.Count
        
            If Not Me.lstvFiltro.ListItems(i).Checked = True Then
                Me.lstvFiltro.ListItems.Remove (i)
            End If
            i = i + 1
    Loop
    
    'Verifica se ainda tem algum item desmarcado
    'Se tiver retorna até que só fiquem na lista os itens marcados
    For i = 1 To Me.lstvFiltro.ListItems.Count
        If Not Me.lstvFiltro.ListItems(i).Checked = True Then GoTo Retorno
       
    Next
    
 
Postado : 22/07/2014 6:55 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Enquanto isso..
http://www.google.com.br/cse?cx=partner ... gsc.page=1

Att

 
Postado : 22/07/2014 7:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Li e procurei compreender, mas não cheguei a uma compreensão lógica:

1º) você utiliza uma rotina que filtra as linhas que estão selecionadas no checkbox do Listview.
Qual Rotina ? Quais instruções utiliza ?

2º) As instruções que postou, somente verificam os itens marcados e Remove do ListView.
Tambem não entendi porque é realizado duas vezes a checagem dos itens marcados.

E quando você diz:
porem quando eu desativo o filtro os checkbox são desmarcados
Qual Rotina utiliza para desfazer este Filtro ?
Acredito que deve ter uma rotina que preenche este ListView com os dados atualizados e por conseguinte é Refeito a listagem.

Se não for isto, favor detalhar melhor.

[]s

 
Postado : 22/07/2014 8:44 am
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

Mauro veja o exemplo em um modelo.

 
Postado : 22/07/2014 10:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Halk, olhando seu modelo, se entendi corretamente, a sua intenção é após filtrar pelos itens que estão com o checkbox selecionado manter estes itens no ListView mas sem estarem marcados, se for isto a sua rotina no btnFiltrar ela refaz a lista do Listview recarregando com todos os itens novamente, par que desmarque os checkbox sem refazer a lista (recarregar o ListView) o ideal é ter um outro botão com a rotina especifica para isto, alias você já tem a rotina é só questão de ajuste, adicione um novo CommandButton renomeie para btnDesmarcar e coloque a rotina abaixo:

Private Sub btnDesmarcar_Click()
    Dim i As Long
    
    i = 1
    
    Do While i <= Me.lstLista.ListItems.Count
                Me.lstLista.ListItems(i).Checked = False
            i = i + 1
    Loop

End Sub

Este código irá tirar a Seleção dos CheckBox e manter os itens.

Editei o post, porque depois de um cafezinho, rsrsrs, ativou o cerebro e pensei, porque outro Botão, podemos ter esta ação na própria rotina do Botão que Filtra os Itens Selecionados, então, se preferir desta forma troque a rotina do Botão Filtrar Itens Selecionados por esta:

Private Sub CommandButton1_Click()
  Dim i As Long
  Dim x As Long
  
    i = 1
Retorno:
    Do While i <= Me.lstLista.ListItems.Count
        
            If Not Me.lstLista.ListItems(i).Checked = True Then
                Me.lstLista.ListItems.Remove (i)
            End If
            i = i + 1
    Loop
    
    'Verifica se ainda tem algum item desmarcado
    'Se tiver retorna até que só fiquem na lista os itens marcados
    For i = 1 To Me.lstLista.ListItems.Count
        If Not Me.lstLista.ListItems(i).Checked = True Then GoTo Retorno
       
    Next
    
    x = 1
    Do While x <= Me.lstLista.ListItems.Count
                Me.lstLista.ListItems(x).Checked = False
            x = x + 1
    Loop
    
End Sub

Espero que seja isto.
[]s

 
Postado : 23/07/2014 5:54 am
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

Mauro Muito bom, mas na verdade o que estou tentado fazer é o contrário.

Ao desativar o filtro (Clicando no botão btnFiltrar) o Listview irá mostrar todos os dados, mas terá de manter ticado o checkbox que eu ativei antes de desativar o filtro.

 
Postado : 23/07/2014 6:36 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Halk, é um pouco mais complicado desta forma, ao refazer o ListView ele é preenchido com todos os Registros que estão no BD, desta forma teria de ser feito da seguinte forma:
1º) Armazenar na planilha os itens que sobraram apos execução do filtro pelo ID de cada um;
2º) Ao recarregar o ListView buscar na planilha esta relação e efetuar busca no listview e marca-los.
Eu só gostaria de entender o porque disto, se uma vez que após carregar o listview na primeira vez e você marcar os chekbox, porque filtrar removendo e depois recarregar e mostrar os que foram marcados na ação anterior.

[]s

 
Postado : 23/07/2014 7:06 am
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

é Porque o Meu listview faz a soma dos dados que estão filtrado, inclusive foi você que me ajudou a montar a rotina de soma.

Então vou fazendo as somas por etapas, e tenho que desativar o filtro para incluir outros itens. Porém quando eu desativo o filtro ele desmarca tudo aí é preciso selecionar tudo outra vez.

Isso dá pra fazer no Excel tranquilamente usando o filtro, mas como eu uso os dados que estão no Access, não é interessante eu ficar exportando para o Excel. Além disso quando eu filtro os itens eu já aproveito para preencher os dados restantes como por exemplo, o n° do documento, data vencimento etc.

 
Postado : 23/07/2014 7:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Halk, para não ter de anexar novamente o arquivo, vou postar somente as alterações que devem ser deitas, é só seguir os passos.

1º ) Adicione uma nova Guia e Renomeie para "BaseId" e em "A1" digite "ID" - (todos sem as Aspas)

2º ) Em seu formulário de Pesquisa, no Botão "Filtrar itens selecionados" troque pela rotina abaixo:

Private Sub CommandButton1_Click()
    Dim i As Long
    Dim x As Long
    Dim iRow
    Dim UltLin As Long
    Dim IdRange As Range
  
    Dim shBaseId As Worksheet
    Set shBaseId = Worksheets("BaseId")
       
    'Verifica a Ultima linha preenchida
    UltLin = shBaseId.Cells(Rows.Count, "A").End(xlUp).Row
        
    If UltLin = 1 Then
    
    Else
        shBaseId.Range("A2:A" & UltLin).ClearContents
        Set IdRange = Range("A2:A" & UltLin)
    End If
  
    i = 1

Retorno:
    
    Do While i <= Me.lstLista.ListItems.Count
        
            If Not Me.lstLista.ListItems(i).Checked = True Then
                Me.lstLista.ListItems.Remove (i)
            End If
            i = i + 1
    Loop
    
    'Verifica se ainda tem algum item desmarcado
    'Se tiver retorna até que só fiquem na lista os itens marcados
    For i = 1 To Me.lstLista.ListItems.Count
        If Not Me.lstLista.ListItems(i).Checked = True Then GoTo Retorno
    Next
    
    x = 1
    iRow = 1
    
    'Armazena na Aba BaseId os itens marcados
    Do While x <= Me.lstLista.ListItems.Count
                iRow = iRow + 1
                shBaseId.Cells(iRow, 1).Value = lstLista.ListItems(x).Text
            x = x + 1
    Loop
    
End Sub

3º ) Copie a rotina abaixo para dentro do modulo dos formulários:

Private Sub RemarcaItens()
    Dim IdRange As Range
    Dim UltLin As Long
    Dim sID
    Dim i
    
    'Definimos a aba
    Dim shBaseId As Worksheet
    Set shBaseId = Worksheets("BaseId")
       
    'Verifica a Ultima linha preenchida
    UltLin = shBaseId.Cells(Rows.Count, "A").End(xlUp).Row
        
    Set IdRange = shBaseId.Range("A2:A" & UltLin)

    For Each sID In IdRange
        
        For i = 1 To lstLista.ListItems.Count
            
            If lstLista.ListItems(i).Text = sID Then
                lstLista.ListItems(i).Checked = True
            End If
        
        Next i
    
    Next sID

End Sub

4º ) No Botão "Filtrar" (btnFiltrar) troque pela rotina abaixo:

Private Sub btnFiltrar_Click()
    'Limpa o cabeçalho do ListView
    lstLista.ColumnHeaders.Clear 'Clear the Column Headers
    Call PopulaListBox(txtNomeEmpresa.Text, txtNomeContato.Text, txtEndereco.Text, txtTelefone.Text, txtRegiao.Text)
    
    Call RemarcaItens
    
End Sub

Refaça os testes e veja se é isto.

[]s

 
Postado : 23/07/2014 11:08 am
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

:shock: :shock: :shock:

Mauro!!!!!!,

Impressionante meu caro amigo. Praticamente igual o filtro do Excel! Fico simplesmente fantástico. Muito obrigado mesmo...

 
Postado : 23/07/2014 11:51 am
 Halk
(@halk)
Posts: 54
Trusted Member
Topic starter
 

Agora Ficou fácil de Sub somar as contas.

 
Postado : 23/07/2014 11:53 am