Notifications
Clear all

Selecionar uma ou mais linhas da lstview através do checkbox

17 Posts
2 Usuários
0 Reactions
3,407 Visualizações
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Pessoal,

O meu projeto de despesas pessoais carrega, via listview, inúmeras linhas de programações de contas a receber e a pagar.

As vezes existe a necessidade de excluir várias programações. Tendo em vista que este projeto permite excluir uma programação por vez, ao deparar-me com 10 ou 20 programações a excluir, por exemplo, identifico a necessidade emergencial de desenvolver um código que permita-me seleciona-las e excluí-las de uma só vez.

Creio que a inserção de checkbox em cada linha preenchida na listview resolveria este problema.

Alguém de vocês possuem um exemplo que atenda a minha necessidade?

 
Postado : 18/05/2014 2:24 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Você pode alterar a Propriedade "MultiSelect" do ListView para "True", ela possibilita selecionar variaas linhas com o auxilio das teclas CTRL ou SHIFT.

Agora um exemplo com checkbox no Listview você pode baixar no link abaixo:
http://www.tomasvasquez.com.br/forum/vi ... 3k5vNJdXQQ

Veja as rotinas, e atente que ao utilizar a opçao de CheckBox terá de alterar as rotinas onde se verifica quais linhas estão selecionadas, uma vez que diferem.
No ListView Multiselect utilizamos:

For i = ListView1.ListItems.Count To 1 Step -1
    If ListView1.ListItems(i).Selected = True Then
        ListView1.ListItems.Remove i
    End If
Next i

No ListView com CheckBox utilizamos:

For i = 1 To ListView1.ListItems.Count
    If ListView1.ListItems(i).Checked = True Then
        '          MsgBox ListView1.ListItems(i).Text
    End If
Next

Espero que ajude.

[]s

 
Postado : 18/05/2014 5:00 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

A opção 2 me atenderá perfeitamente, mas, até então, as adaptações que eu fiz, de acordo com o seu exemplo, permitiram-me apenas selecionar as linhas e deixá-las na cor vermelha, isso já é um bom começo.

Para finalizarmos, preciso que instrua-me acerca do código que faz a exclusão das linhas selecionadas. A minha vontade é de colocá-lo no botão de excluir, localizado ao lado da listview referida.

O que devo fazer?

Alisson.

 
Postado : 19/05/2014 10:29 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, o principio de deletar é o mesmo que utiliza atualmente "este projeto permite excluir uma programação por vez", estou supondo com esta frase que você já tem a rotina para excluir "uma programação", então seria o caso de em cada verificação dos itens selecionados direcionar para a rotina que já utiliza, não tem como deletar todos de uma vez só, tem de ser um por um.

Como não sei a estrutura de sua rotina, com certeza tem uma instrução que localiza o item na planilha e deleta, então, seria mais ou menos assim :

For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Checked = True Then
Call Deleta_Item
End If
Next

[]s

 
Postado : 19/05/2014 4:04 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Este é o código que o meu projeto faz para excluir uma linha selecionada. Antes disso ele faz uma verificação, do tipo: verificar se, com a exclusão da linha selecionada, o meu saldo ficará positivo ou negativo. Caso ficar negativo, o projeto impede a exclusão referida e eu recebo uma msgbox informando que o valor a ser reduzido para que possa excluí-la.

Vide o código de exclusão caso todos if's forem aprovados:

If alterar = True And (CDbl(TextBox2.Value) > (CDbl(TextBox8.Value))) Then

MsgBox "Alteração não permitida, pois o valor supera o permitido. Reduza as suas despesas futuras em: R$ " & TextBox41, vbCritical, "Atenção!"

TextBox2.SetFocus

Exit Sub
End If

A pergunta é: onde inserir o código:

For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Checked = True Then
Call Deleta_Item 'substituir pelo o meu código de exclusão.
End If
Next

 
Postado : 19/05/2014 6:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro,
Este é o código que o meu projeto faz para excluir uma linha selecionada. Antes disso ele faz uma verificação, do tipo: verificar se, com a exclusão da linha selecionada, o meu saldo ficará positivo ou negativo. Caso ficar negativo, o projeto impede a exclusão referida e eu recebo uma msgbox informando que o valor a ser reduzido para que possa excluí-la.

Vide o código de exclusão caso todos if's forem aprovados:
If alterar = True And (CDbl(TextBox2.Value) > (CDbl(TextBox8.Value))) Then

MsgBox "Alteração não permitida, pois o valor supera o permitido. Reduza as suas despesas futuras em: R$ " & TextBox41, vbCritical, "Atenção!"

TextBox2.SetFocus

Exit Sub
End If

A pergunta é: onde inserir o código:

For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Checked = True Then
Call Deleta_Item 'substituir pelo o meu código de exclusão.
End If
Next

Lorenzon, na realidade eu é que tenho de fazer a pergunta. Onde está a rotina ou instruções para Exclusão ?
Na instrução que postou, a mesma faz somente a verificação se Alterar é Verdadeiro e o Valor do TextBox2 é Maior que o Valor do TextBox8, se for emite uma Mensagem e sai da rotina.

Outra questão é que diz tambem que este é o código de exclusão caso todos if's forem aprovados, Quantod If(s) temos ?

Quanto as instruções que indiquei, você tem de adaptar ao Botão ou Controle que está usando quando vai executar a Exclusão, ou seja, ao clicar no controle, Primeiro irá captar a linha Selecionada (True), ao localizar a primeira irá direcionar para o Primeiro If, se a condição atender conforme colocou acima, em vez de sair, iremos para o próximo item selecionado do ListView, se não atender irá para a instrução de Exclusão, apos retornará para verificar a proxima linha, ou seja, irá fazer um Loop em todas as linhas do Listview, e direcionar uma de cada vez.

[]s

 
Postado : 20/05/2014 4:30 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Consegui adaptá-lo ao meu código de exclusão. Para ser mais claro, com a inserção deste código, a partir de então, a exclusão só acontece mediante a seleção de alguma linha através do checkbox, do contrário, o código não da continuidade.

Porém a minha expectativa era de, ao selecionar três ou quatro linhas e, ao clicar no botão ''excluir'', o mesmo verificaria, através dos if's, se todas as linhas selecionadas atendem aos critérios de exclusão e, uma vez atendidos, o código as excluiriam.

Mas, mesmo assim, as exclusões acontecem de uma a uma, ou seja, depois de excluir uma linha e caso eu quiser excluir outra linha, é necessário a seleção de uma outra linha.

Ta confuso para mim.

 
Postado : 20/05/2014 6:26 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, a confusão toda se dá, como já comentei anteriormente, é pelo fato que eu estou indo por suposição, uma vez que não colocou qual Macro está utilizando completa, colocou somente uma linha referente a uma verficação de textbox.

Então segue mais uma suposição, se não for isto ainda, favor colocar a rotina completa ou anexar seu modelo reduzido e compactado:

As linhas estão comentadas, então uma sugestão antes de adaptar as suas instruções seria adicionar um novo Botão e colocar o código abaixo só para fazer uns testes antes se está informando corretamente as linhas selecionadas.

    'Conta e Armazena a qde total de linhas
    'carregadas no ListView na instrução ListItems.Count
    For i = 1 To ListView1.ListItems.Count
    'em For i iniciamos o Loop nas Linhas
    
        'Aqui começamos a verificação
        'Se o Item estiver Selecionado
        If ListView1.ListItems(i).Checked = True Then
            'Mensagem só para informção
            MsgBox "Selecionado : " & ListView1.ListItems(i).Text
            
            'Apos verificação, Se Verdadeiro
            'Aqui entra suas Instruções com os IF(s)
            'If.......Then - Não sei que tipos de verificações são feitas
                'Se Condição atendida
                 'Direcionamos para a Exclusão
                 'Call Deleta_Item 'substituir pelo seu código de exclusão
            
            'Se não atendida
            Else
                MsgBox "Nao faz nada e passa para o Proximo"
                
        End If
        
    Next

[]s

 
Postado : 21/05/2014 8:25 am
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

De fato é isto que eu preciso!!!!

Atendendo as suas orientações, eu criei mais um botão para testar as exclusões e adaptei o seu código. Funcionou legal, porém mesmo com a apresentação da msgbox, informando que os itens selecionados foram excluídos, o projeto persiste em excluir apenas a primeira linha.

Vide a minha adaptação. Onde errei?

Private Sub CommandButton47_Click()
'Conta e Armazena a qde total de linhas
'carregadas no ListView na instrução ListItems.Count

Dim i

For i = 1 To lslista.ListItems.Count
'em For i iniciamos o Loop nas Linhas

'Aqui começamos a verificação
'Se o Item estiver Selecionado

If lslista.ListItems(i).Checked = True Then
'Mensagem só para informção
MsgBox "Selecionado : " & lslista.ListItems(i).Text

'Apos verificação, Se Verdadeiro
'Aqui entra suas Instruções com os IF(s)

End If

If TextBox55.Value > 0 Then

' este é o código que faz as exclusões
CadastroProdutos.Range(CadastroProdutos.Cells(indiceRegistro, colCodigo), CadastroProdutos.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

MsgBox "O Registro escolhido foi excluído com sucesso.", , "Cadastro"
txtCodigo.Enabled = False

Else

MsgBox "Desculpa-me, mas a exclusão desta programação de entrada influenciará as demais programações de Saída. Reduza as despesas futuras e tente novamente!", vbCritical, "Atenção!"

MsgBox "Não existe registro a ser excluído", , "Cadastro"

End If

Next i

End Sub

 
Postado : 21/05/2014 6:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, elimine o "End If" que vem após a linha abaixo :

'Aqui entra suas Instruções com os IF(s)

End If

E coloque abaixo do último "End If" antes de "Next i"

Acredito que resolverá.

[]s

 
Postado : 23/05/2014 2:01 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Apareceu a mensagem:

next sem for

 
Postado : 23/05/2014 2:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, ou você colocou o outro End If sem apagar o que eu mencionei, ou colocou no lugar errado, não é para dar erro, a não ser que tenha mais IF(s) nesta rotina.

Veja como deve ficar, eliminei as linhas de comentários para ficar mais limpa :

Private Sub CommandButton47_Click()

Dim i

    For i = 1 To lslista.ListItems.Count
    
        If lslista.ListItems(i).Checked = True Then
            
            MsgBox "Selecionado : " & lslista.ListItems(i).Text
        
            If TextBox55.Value > 0 Then
            
                ' este é o código que faz as exclusões
                CadastroProdutos.Range(CadastroProdutos.Cells(indiceRegistro, colCodigo), CadastroProdutos.Cells(indiceRegistro, colCodigo)).EntireRow.Delete
                
                MsgBox "O Registro escolhido foi excluído com sucesso.", , "Cadastro"
                txtCodigo.Enabled = False
            
            Else
            
                MsgBox "Desculpa-me, mas a exclusão desta programação de entrada influenciará as demais programações de Saída. Reduza as despesas futuras e tente novamente!", vbCritical, "Atenção!"
                MsgBox "Não existe registro a ser excluído", , "Cadastro"
            
            End If
        
        End If
    
    Next i

End Sub

Perceba as posições dos If...Then...End If, sempre que abrimos um temos de fecha-lo e qdo aninhamos o ideal é identar para verificar a sequencia correta.

[]s

 
Postado : 23/05/2014 4:24 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Agradeço pela sua atenção, mas, infelizmente, mesmo com a solução do caso ''NEXT SEM FOR'' o projeto persiste em excluir aenas o primeiro item selecionado.

Creio que, se substituímos o código da exclusão, resolveremos o problema.

Por favor, indica-me um código de exclusão a substituir este:

' este é o código que faz as exclusões
CadastroProdutos.Range(CadastroProdutos.Cells(indiceRegistro, colCodigo), CadastroProdutos.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

 
Postado : 24/05/2014 4:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro,
Agradeço pela sua atenção, mas, infelizmente, mesmo com a solução do caso ''NEXT SEM FOR'' o projeto persiste em excluir aenas o primeiro item selecionado.
Creio que, se substituímos o código da exclusão, resolveremos o problema.

Por favor, indica-me um código de exclusão a substituir este:
' este é o código que faz as exclusões
CadastroProdutos.Range(CadastroProdutos.Cells(indiceRegistro, colCodigo), CadastroProdutos.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

Lorenzon, pelo que percebi até o momento é que a questão inicial foi resolvida, que seria selecionar mais de um item e identificar, tambem já havia comentado que teria de fazer ajustes em suas rotinas para que funcionasse a contento.
Com a resolução do Loop, a questão agora é a Exclusão, ou seja totalmente diferente do enunciado inicialmente, e conforme seus comentários, se está excluindo somente o primeiro item, com certeza é que em alguma parte das instruções que está utilizando, a Variável está se perdendo e zerando a mesma.
Como já disse, estou indo por suposições, é dificil quando temos de analisar somente parte do projeto, agora, pela sua instrução de exclusão, pressuponho que está adaptando o Modelo de Cadastro do Tomas, então a Linha que será Excluida é a que se encontra nas Variaveis Cells(indiceRegistro, colCodigo), ou sejá, não tem nenhuma ligação da Variável referente a Linha selecionada no ListView nesta instrução, portanto se está Excluindo alguma linha, com certeza não provem da instrução das Linhas selecionadas no ListView.

Procure seguir Passo a Passo as instruções utilizando a tecla "F8" para saber o que está atribuído nas Variáveis indiceRegistro, colCodigo e na Variável "i" do ListView, eu entendo que o correto seria fazer a atribuição : indiceRegistro = i, mas, não posso garantir porque não sei em que momento esta Variável (indiceRegistro) está sendo carregada.

[]s

 
Postado : 24/05/2014 6:59 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Pelo o meu entendimento, deduzo que você orientou-me a excluir a linha através do código da programação, o qual refere-se ao indiceRegistro mencionado por você. Se sim, preciso informá-lo que, infelizmente, não encontrei um código que a faça, bem como desenvolver um que atenda esta demanda.

Mas, ao ver este post http://www.tomasvasquez.com.br/forum/vi ... 35ieXJdWNA vi que, se inserirmos uma linha para excluir do banco de dados (sheets) e substituirmos o:
' este é o código que faz as exclusões
CadastroProdutos.Range(CadastroProdutos.Cells(indiceRegistro, colCodigo), CadastroProdutos.Cells(indiceRegistro, colCodigo)).EntireRow.Delete

por um call Private Sub CommandButton1_Click() resolveria.

O que acha?

 
Postado : 24/05/2014 7:57 pm
Página 1 / 2