Filtro em List View
Alguem conhece um modo legar de fazer um filtro numa listview?
eu faço da seguinte maneira:
Tenho uma listview1 com os itens. E outra (listview2) sem item nenhum, na qual aparecem os itens quando filtrados.
eu percorro a listview1 procuro se existe o texto buscado e entao adiciona na listview2.
Porem há um problema nisso, o programa fica travado enquanto esta buscando, e é muito demorado.
se alguem tiver outro modo, agradeceria.
eu faço da seguinte maneira:
Tenho uma listview1 com os itens. E outra (listview2) sem item nenhum, na qual aparecem os itens quando filtrados.
eu percorro a listview1 procuro se existe o texto buscado e entao adiciona na listview2.
Porem há um problema nisso, o programa fica travado enquanto esta buscando, e é muito demorado.
se alguem tiver outro modo, agradeceria.
Jackson Veiga
Curtidas 0
Respostas
Bruno Leandro
17/03/2012
você precisa usar o listview, ou tem a possibilidade de utilizar outro componente, pois o dbgrid ficaria bem mais simples este processo de filtro
GOSTEI 0
Jackson Veiga
17/03/2012
mas neste caso, para mim eu queria usar a listview, para mim seria mais viavel, pois não conheço muito o dbgrid, e nao gosto do q conheço dele
GOSTEI 0
Bruno Leandro
17/03/2012
você esta usando o Items.BeginUpdate e Items.EndUpdate ao adicionar os itens talvez ajude um pouco no desempenho, você esta buscando como com IndexOf?
GOSTEI 0
Jackson Veiga
17/03/2012
não, eu vou montar aqui e ja mando o modo como estou usando.
GOSTEI 0
Jackson Veiga
17/03/2012
O modo como estou fazendo o filtro é este:
para facilitar e se tornar um pouco mais rapido, eu jogo todos os items para a listview2 e dps vou procurando pelo texto no caption e excluo o item se nao for encontrado nada do texto nele
o codigo q eu postei é bem basico, entao se nao colocar nada na edit ele nao encontra nada, mais eu fiz agora, pois nao estou com o meu projeto em maos
var
i:integer;
begin
ListView2.Items.Assign(ListView1.Items);
ListView2.Items.BeginUpdate;
for i:=ListView2.Items.Count-1 downto 0 do
if pos(LowerCase(Edit1.Text),LowerCase(ListView2.Items.Item[i].Caption))=0 then
ListView2.Items.Delete(i);
ListView2.Items.EndUpdate;
end;para facilitar e se tornar um pouco mais rapido, eu jogo todos os items para a listview2 e dps vou procurando pelo texto no caption e excluo o item se nao for encontrado nada do texto nele
o codigo q eu postei é bem basico, entao se nao colocar nada na edit ele nao encontra nada, mais eu fiz agora, pois nao estou com o meu projeto em maos
GOSTEI 0
Bruno Leandro
17/03/2012
olá coloque o ListView2.Items.BeginUpdate; antes do ListView2.Items.Assign(ListView1.Items); veja se fica com bom desempenho
GOSTEI 0
Jackson Veiga
17/03/2012
creio que nao va resolver, porque colocando ali talvez ele apenas agilize o processo de jogar todos itens de uma list para outra, e o problema de travar esta na parte do for.
pois enquanto o comando for esta executando o aplicativo fica travado, e dependendo da quantidade na list isso pode demorar muito
pois enquanto o comando for esta executando o aplicativo fica travado, e dependendo da quantidade na list isso pode demorar muito
GOSTEI 0