Treeview

develomagaly Messages postés 46 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 3 mai 2006 - 19 oct. 2005 à 10:34
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 20 oct. 2005 à 10:05
Bonjour,

J'utilise un treeview que je charge a l'aide de ma base de donnée
j'utilise une procedure chargerTreeview, chargerSousGroupe et chargerSousSousGroupe.

La procedure chargerTreeview charge les noeuds principales (sa marche ! ). Dans cette pprocedure je fais appel à la procédure chargerSousGroupe. Elle charge les noeuds enfants ( sa marche ! ) Et dans cette procedure je fais une procedure ChargerSousSousGroupe qui doit charger les noeuds enfants des noeuds enfants ( tout le monde suit?).
On doit obtenir :
DONNEES FOYERS
NOM DU FOYER X
PERIODE A
PERIODE B
SITUATION

En suite dans le procedure chargerSousSousGroupe , on fait appel a la procedure chargerSousSousGroupe ( à elle même quoi ! )

Le problème est que quand je suis arriver à la procedure chargerSousSousGroupe il faudrait que je puisse selectionner le noeuds enfants ( sa sa marche po car il me selectionne le noeuds principale

Code :
{ Chargement du treevieuw avec la base de données }
procedure TCdrGroupe.ChargerTreeview();
var NbLig,j: integer ;
begin
// il faut charger le treeview en fonction des données de la base de données
DataSet.Active:= false ;
DataSet.CommandText:='SELECT DISTINCT grp_NomGroupe FROM groupe WHERE grp_NoPlan =''ALL'' OR grp_NoPlan='''+ TypeSim + ''' or grp_NoPlan = ''' + TypeGroupe + ''' ORDER BY grp_ordre ;';


DataSet.Active:=true;
DataSet.First;


NbLig:=DataSet.RecordCount;
for j: =1 to NbLig do
begin
if (FrmSimulation.TreeView.Items.Count= 0) then
begin
with FrmSimulation.TreeView.Items.AddFirst (nil,DataSet.FieldByName ('grp_NomGroupe').AsString) do
selected : =true ;


ChargerSousGroupe(DataSet.FieldByName('grp_NomGroupe').AsString);
end
else
begin
with FrmSimulation.TreeView.Items.Add (FrmSimulation.TreeView.Selected,DataSet.FieldByName ('grp_NomGroupe').AsString) do
selected := true ;
ChargerSousGroupe(DataSet.FieldByName('grp_NomGroupe').AsString);
end;
DataSet.Next;
end
end;


{Chargement des sous groupe en fonction du NomGroupe donner en paramètre}
procedure TCdrGroupe.ChargerSousGroupe(NomGroupe:string);
var NbLig,i:integer ;
begin
//On va chercher les sous Groupes par rapport a plusieurs critères :
// - le NoPlan ou on se trouve IBA, IBI, SBA, SBI
// - le groupe qu'il faut renseigner ( en paramètre )
datasetsg.Active: =false; datasetsg.CommandText:'SELECT sgrp_NomSousGroupe,niveau FROM sousgroupe g WHERE sgrp_NomGroupe '''+ NomGroupe + ''' AND sgrp_NoPlan IN (''ALL'', '''+ typesim+ ''',''' +typeGroupe + ''') ORDER BY sgrp_ordre;';


datasetsg.Active:=true ;
datasetsg.First ;


nblig:=datasetsg.RecordCount;


for i: =1 to nblig do
begin
with FrmSimulation.TreeView.Items.AddChild (FrmSimulation.TreeView.Selected,DataSetsg.FieldByName('sgrp_NomSousGroupe').AsString) do

if DataSetsg.FieldByName('niveau').AsInteger > 0 then ChergerSousSousGroupe(DataSetsg.FieldByName('sgrp_NomSousGroupe').AsString);
datasetsg.Next;


end;
nblig:= 0;
end;


procedure TCdrGroupe.ChergerSousSousGroupe(NomSousGroupe:string);
var Nblig,i:integer;
begin
DataSetSgrp.Active: =false; DataSetSgrp.CommandText:'SELECT sgrp_NomSousGroupe,niveau FROM sousgroupe WHERE sgrp_NomGroupe'''+nomSousGroupe+''';';
DataSetSgrp.Active:=true ;


Nblig:=datasetsgrp.RecordCount;


for i: =1 to nblig do
begin


with FrmSimulation.TreeView.Items.AddChild(FrmSimulation.TreeView.Selected,DataSetsgrp.FieldByName('sgrp_NomSousGroupe').AsString)do


// if DataSetSgrp.FieldByName('niveau').AsInteger>0 then ChergerSousSousGroupe(DataSetsgrp.FieldByName('sgrp_NomSousGroupe').AsString);
datasetsgrp.Next;
end;
end;

1 réponse

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
20 oct. 2005 à 10:05
Je me suis pas trop penché sur ton code, mais si j'étais toi je
passerais le noeud auquel tu veux ajouter les enfants comme un
paramètre de tes procédures.



genre ChargerSousSousGroupe(NomSousGroupe:string; NoeudParent : TTreeNode)



comme ça tu ne te base pas sur la selection, mais bien sur un noeud
particulier pour les ajouter. pas de problème de selection qui change
sans que tu saches pk. (une cause possible de ton problème)



Sinon, pour une question de propreté et de modularité (et donc de
facilité de tests), j'essairais de passer non pas le paramètre de ta
requete, mais le resultat. Dans ton cas, je sais pas si ça vaut la
peine. mais penses-y la prochaine fois. Il est souvent plus sage de
séparer les procédures d'affichage et de manipulation de donnée.



En espérant t'avoir donné une voie utile,


Loda



PS: sinon je connais pas la partie BD, mais es-tu sur que l'appel de
"DataSetSgrp.Active:= XXX;" au milieu de ta boucle for ne dérange pas?
0
Rejoignez-nous