PDA

Ver la Versión Completa : Misterio con un listview al utilizar su propio search


nincillo
29-10-2017, 09:27:12
Buenos días. Tengo un misterio que no consigo resolver.

Tengo un listview en el que cargo el contenido de un TFDMemTable mediante un bucle while not eof.

Al finalizar el bucle muestro tanto el recordcount como el items.count y me dan el mismo número. Hasta ahí todo normal.

Tengo un botón para refrescar el listview haciendo cada vez un close y un open de la tabla.

Da igual las veces que le de al botón refrescar, que cuando escribo por primera vez en el recuadro del search del propio listview me encuentra todos los registros que cumplen la condición.

El problema se presenta tras escribir en el search. A partir de ese momento, si vuelvo a dar al botón de refrescar, el listview ya no me muestra todos los registros que debiera. Si embargo, el recordcount y el items.count siguen marcando lo mismo que al principio. O sea, es como si parte de los registros no estuvieran visibles.

AgustinOrtu
29-10-2017, 15:43:04
Hola nincillo, no termine de entender el problema. Creo que tu escenario es este:

1. Traes todos los datos, ej count = 100
2. Escribes en el search
3. Ejecutas el refrescar, ahora count = 10
4. Limpias el search y das a refrescar, count = 10 y deberia ser 100

Podrias poner el codigo?

nincillo
31-10-2017, 07:08:40
Hola nincillo, no termine de entender el problema. Creo que tu escenario es este:

1. Traes todos los datos, ej count = 100
2. Escribes en el search
3. Ejecutas el refrescar, ahora count = 10
4. Limpias el search y das a refrescar, count = 10 y deberia ser 100

Podrias poner el codigo?

Al final creo que ya he encontrado el origen del problema y la solución.

Basícamente el problema parece ser que en cuanto se escribe en el filtro, algo se queda "memorizado" en el interior, que aunque se borre manualmente el filtro, se borren los items, al volver a cargar la lista, parece que el filtro previo anda por ahí "dentro" haciendo de las suyas.

Parace que funcione correctamente el cada vez que se vaya rellenar la listview, previamente insertar los registros hay que hacer lo siguiente:

(* Fundamental para que haga el refresco del listview completo y no se queden registros ocultos *)
dm.qryAlmacen.Active := false;
(* Con esto buscamos el componente donde escribimos el filtro para vaciarlo *)
for I := 0 to ListView2.Controls.Count-1 do
if ListView2.Controls[I].ClassType = TSearchBox then
begin
TSearchBox(ListView2.Controls[I]).Text := '';
Break;
end;
(* Con esto inicializo el filtro y es con lo que relamente soluciono el problema *)
ListView2.Items.Filter := nil;
(* Vuelvo a cargar los registros en el listview *)
dm.qryAlmacen.Active := true;

AgustinOrtu
31-10-2017, 20:06:48
Crei que hablabamos del ListView de la Vcl. El de firemonkey he visto por ahi algunas variables con nombres estilo "filtered items", por lo que si es posible que sea algo de lo que comentas