Eu tenho um CheckedListBox onde desejo um evento após a verificação de um item para que eu possa usar CheckedItems com o novo estado.
Como ItemChecked é disparado antes de CheckedItems ser atualizado, ele não funcionará imediatamente.
Que tipo de método ou evento posso usar para ser notificado quando o CheckedItems for atualizado?
c#
winforms
checkedlistbox
hultqvist
fonte
fonte
if not item = checkedListBox1.Items[e.Index].ToString()
Existem várias postagens StackOverflow relacionadas a isso ... Além da solução de Branimir , aqui estão duas outras simples:
Execução atrasada no ItemCheck (também aqui ):
Usando o evento MouseUp :
Prefiro a primeira opção, pois a segunda resultaria em falsos positivos (ou seja, disparar com muita frequência).
fonte
The check state is not updated until after the ItemCheck event occurs
. Um evento diferente ou uma solução alternativa não arbitrária seria bom IMO.Eu tentei isso e funcionou:
fonte
ItemChecked
evento e ninguém disse que ele não existia.ItemChecking
,ItemChecked
, então você poderia usar este último um. Mas se apenas um for implementado (ItemCheck
), ele está fazendo as coisas corretamente, ou seja, disparando o evento antes que o valor seja verificado com o novo valor e o índice fornecido como parâmetros. Quem quiser o evento "após a mudança", pode simplesmente usar o acima. Se sugerir algo à Microsoft, então sugira um novo eventoItemChecked
, não alterando o existente: ver a resposta deDerivar
CheckedListBox
e implementarfonte
Embora não seja ideal, você pode calcular os CheckedItems usando os argumentos que são passados para o
ItemCheck
evento. Se você olhar este exemplo no MSDN , poderá descobrir se o item recém-alterado foi marcado ou desmarcado, o que o deixa em uma posição adequada para trabalhar com os itens.Você pode até criar um novo evento que dispara depois que um item é verificado, o que lhe daria exatamente o que você queria, se desejasse.
fonte
Após alguns testes, pude constatar que o evento SelectedIndexChanged é acionado após o evento ItemCheck. Manter a propriedade CheckOnClick True
Melhor codificação
fonte
Isso funciona, mas não tenho certeza de como é elegante!
fonte
Não sei se isso se aplica, mas eu queria usar uma caixa de seleção para filtrar os resultados. Assim, conforme o usuário marcava e desmarcava os itens, eu queria que a lista mostrasse / ocultasse os itens.
Eu estava tendo alguns problemas que me levaram a este post. Só queria compartilhar como fiz isso, sem nada de especial.
Nota: Tenho CheckOnClick = true, mas provavelmente ainda funcionaria sem
O evento que uso é " SelectedIndexChanged "
a enumeração que uso é " .CheckedItems "
Isso dá os resultados que acho que podemos esperar. Tão simplificado se resume a ....
fonte
Supondo que você queira preservar os argumentos,
ItemCheck
mas seja notificado depois que o modelo for alterado, deve ser assim:Onde
CheckedItemsChanged
poderia ser:fonte
Eu uso um Timer para resolver este problema. Habilite o cronômetro por meio do evento ItemCheck. Tome uma atitude no evento Timer's Tick.
Isso funciona se o item é verificado através de um clique do mouse ou pressionando a barra de espaço. Aproveitaremos o fato de que o item que acabou de ser marcado (ou desmarcado) é sempre o Item selecionado.
O intervalo do temporizador pode ser tão baixo quanto 1. No momento em que o evento Tick é gerado, o novo status Verificado será definido.
Este código VB.NET mostra o conceito. Existem muitas variações que você pode empregar. Você pode querer aumentar o intervalo do temporizador para permitir que o usuário altere o status de verificação em vários itens antes de agir. Em seguida, no evento Tick, faça uma passagem sequencial de todos os itens na lista ou use sua coleção CheckedItems para tomar a ação apropriada.
É por isso que primeiro desabilitamos o Timer no evento ItemCheck. Desativar e Ativar faz com que o período de intervalo seja reiniciado.
fonte
No comportamento normal, quando verificamos um item, o estado de verificação do item muda antes que o manipulador de eventos seja acionado. Mas um CheckListBox tem um comportamento diferente: o manipulador de eventos é gerado antes que o estado de verificação do item seja alterado e isso torna difícil corrigir nossos trabalhos.
Em minha opinião, para resolver esse problema, devemos adiar o manipulador de eventos.
fonte
Eu tentei isso e funcionou:
determinar pelo índice da lista.
fonte