Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar hijos de un nodo padre en treeview (https://www.clubdelphi.com/foros/showthread.php?t=93969)

Fat 29-05-2019 16:06:33

Eliminar hijos de un nodo padre en treeview
 
Buenas a todos,

Espero puedan ayudarme y gracias por su tiempo.

Mi problema es que lleno un treeview con datos extraídos de una base de datos SQL. Esto lo hago en el evento OnExpanding, hasta ahí todo bien. El problema esta que al contraer y volver a expandir un nodo los datos se vuelven a agregar y así sucesivamente todas las veces que contraiga y expanda ese nodo o cualquier otro que ya haya expandido una vez.

Muchas gracias, un saludo.

Casimiro Notevi 29-05-2019 16:14:55

Cita:

Empezado por Fat (Mensaje 532228)
Esto lo hago en el evento OnExpanding

Puede que tengas que usar otro evento.

Fat 29-05-2019 16:32:44

Lo que pretendo hacer es que cada ves que se expanda el nodo es eliminar los hijos y volverlos a cargar.

Cita:

Puede que tengas que usar otro evento.
No se me ocurre en que otro evento poder cargar los datos al treeview :mad:.

Un saludo.

look 29-05-2019 16:33:48

Cita:

Empezado por Fat (Mensaje 532228)
Buenas a todos,

Espero puedan ayudarme y gracias por su tiempo.

Mi problema es que lleno un treeview con datos extraídos de una base de datos SQL. Esto lo hago en el evento OnExpanding, hasta ahí todo bien. El problema esta que al contraer y volver a expandir un nodo los datos se vuelven a agregar y así sucesivamente todas las veces que contraiga y expanda ese nodo o cualquier otro que ya haya expandido una vez.

Muchas gracias, un saludo.

pon un procedimiento que limpie antes de llenar los datos, y llamalo justo antes de llenar el tree.

Casimiro Notevi 29-05-2019 16:38:32

Cita:

Empezado por look (Mensaje 532231)
pon un procedimiento que limpie antes de llenar los datos, y llamalo justo antes de llenar el tree.

^\||/^\||/^\||/

Fat 29-05-2019 16:52:35

Cita:

pon un procedimiento que limpie antes de llenar los datos, y llamarlo justo antes de llenar el tree.
La ayuda que pido es saber exactamente que poner en ese procedimiento.

Gracias.

WHILENOTEOF 29-05-2019 17:12:00

Podrías borrar todos los hijos de ese nodo, antes de volver añadir los datos (recorres los hijos de ese nodo-padre y los borras, si tienen objetos asociados al data del nodo, los liberas antes), pero mucho mejor es que una vez que has leído los datos de ese nodo y rellenado los hijos marques un flag para saber que ya están leídos, puedes utilizar alguna propiedad del nodo que no te sirva para otras cosas (por ejemplo ImageIndex, o SelectedImageIndex) y antes de leer los datos en el OnExpanding ves como está la propiedad, si están por leer los añadas y si están leídos no haces nada.

look 29-05-2019 17:21:20

Cita:

Empezado por Fat (Mensaje 532233)
La ayuda que pido es saber exactamente que poner en ese procedimiento.

Gracias.

Hola amigo, si sabes como llenar el tree no veo problema en vaciarlos, tampoco es necesario hacer un procedure, en fin, algo tan simple como un Tree.Items.Clear; no recuerdo bien.

te recomiendo lo siguiente, crea un procedure que sirva para llenar el tree por completo y no llenarlo segun se expanda por el usuario.

roman 29-05-2019 17:52:52

Cita:

Empezado por Fat (Mensaje 532228)
Mi problema es que lleno un treeview con datos extraídos de una base de datos SQL. Esto lo hago en el evento OnExpanding, hasta ahí todo bien. El problema esta que al contraer y volver a expandir un nodo los datos se vuelven a agregar y así sucesivamente todas las veces que contraiga y expanda ese nodo o cualquier otro que ya haya expandido una vez.

¿Por qué no simplemente checas si el nodo tiene hijos? Si ya tiene hijos es que ya los leíste y no hay que volver a hacerlo:

Código Delphi [-]
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
begin
    if Node.Count = 0 then
    begin
    
        // Lees los hijos
    
    end;
end;

// Saludos

WHILENOTEOF 29-05-2019 19:43:56

Cita:

Empezado por roman (Mensaje 532237)
¿Por qué no simplemente checas si el nodo tiene hijos? Si ya tiene hijos es que ya los leíste y no hay que volver a hacerlo:

Código Delphi [-]
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
begin
    if Node.Count = 0 then
    begin
    
        // Lees los hijos
    
    end;
end;

// Saludos

Si esto fuese stackoverflow, esta sería mi opción correcta. Yo creo que siempre que se pueda hay que optimizar las consultas a la base de datos, y nunca me han gustado ni hacer llamadas para traerlo todo, ni llamar varias veces para traerme los mismos datos con borrados continuos.

Fat 29-05-2019 21:45:11

En muchas ocasiones lo que creemos que es un marrón por resolver la solución es la más simple posible.

Gracias Roman por la idea que al final es la solución que he utilizado y la que creo es la más simple.

solo hacer el apunte de restar -1 ya que sino cuenta el nodo y el conteo siempre es = 1

Código Delphi [-]
if Node.Count - 1 = 0 then

Con el ejemplo de Roma sería

Código Delphi [-]
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
begin
    if Node.Count = 1 then
    begin
    
        // Lees los hijos
    
    end;
end;

Muchas gracias a todos por su apreciada ayuda.
^\||/^\||/^\||/

Un saludo

TOPX 29-05-2019 23:53:14

Cita:

Empezado por WHILENOTEOF (Mensaje 532239)
stackoverflow

:eek:
-

WHILENOTEOF 30-05-2019 08:24:49

Cita:

Empezado por TOPX (Mensaje 532241)

:confused:

Casimiro Notevi 30-05-2019 08:59:32

Cita:

Empezado por WHILENOTEOF (Mensaje 532239)
Si esto fuese stackoverflow, esta sería mi opción correcta. Yo creo que siempre que se pueda hay que optimizar las consultas a la base de datos, y nunca me han gustado ni hacer llamadas para traerlo todo, ni llamar varias veces para traerme los mismos datos con borrados continuos.

El problema es que, como casi siempre, tenemos que adivinar, pues no sabemos realmente la finalidad de leer esos datos, si tiene que recargarlos cada x tiempo por si hay cambios, etc. Así que las respuestas son normalmente "adivinatorias".

Si de primera hora nos dice que solamente quiere leer esos datos y que no los lea más, entonces las respuestas hubiesen sido otras. Por ejemplo, la de Román.

WHILENOTEOF 30-05-2019 09:05:37

Cita:

Empezado por Casimiro Notevi (Mensaje 532245)
El problema es que, como casi siempre, tenemos que adivinar, pues no sabemos realmente la finalidad de leer esos datos, si tiene que recargarlos cada x tiempo por si hay cambios, etc. Así que las respuestas son normalmente "adivinatorias".

Si de primera hora nos dice que solamente quiere leer esos datos y que no los lea más, entonces las respuestas hubiesen sido otras. Por ejemplo, la de Román.


Completamente de acuerdo.

roman 30-05-2019 14:10:31

En realidad, yo no entendí el comentario de stackoverflow :(

// Saludos

Casimiro Notevi 30-05-2019 15:02:02

Cita:

Empezado por roman (Mensaje 532250)
En realidad, yo no entendí el comentario de stackoverflow :(
// Saludos

Ese no lo entendió nadie :)

WHILENOTEOF 30-05-2019 17:22:00

Cita:

Empezado por Casimiro Notevi (Mensaje 532252)
Ese no lo entendió nadie :)


Yo tampoco lo entendí :D. Bueno me refería que creo que en stackoverflow uno marca la respuesta que cree más adecuada, y decía que en esta caso para mí sería la respuesta de Román.


La franja horaria es GMT +2. Ahora son las 21:24:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi