动态创建treeview 急(100)

  • 主题发起人 主题发起人 嚼槟榔
  • 开始时间 开始时间

嚼槟榔

Unregistered / Unconfirmed
GUEST, unregistred user!
各位前辈: 我有一个学校表 有学院 班级 人员 要利用ado+treeview实现以下效果(即学校人员分布图) +学校 +商学院(共Y人) +a班(x人) 张三 李四 +b班(x人) 张三 李四 +c班(x人) 张三 李四 +理学院 +a班 +b班 +c班 +文学院 +a班 +b班 +c班我能利用add方法加入每个学院名,还需要把每个学院里的班级加入到加入到学院的子节点,并计算每个学院共有多少人(共Y人),最后还要把第个班级的人员加入到班级的子节点,并计算显示第个班级有多少人(X人)。自己琢磨了一些候,实在水平不行,特向各位前辈求助。万分感激!
 
你既然会添加学院名子节点了,使用相应的方法增加级别和学员节点就可以了呀。我最常用的方法是用 ImageIndex 来区别各节点的类别,你也可以使用节点的 Level 属性来区别。
 
....具体说不清楚 你树太多了 不过只要你数据库表结构没问题 这树就绝对轻松许多
 
怎样遍历动态创建的根节点呢?指向下一个节点怎么表示呀?
 
建立树当然是选择递归了
 
应该用不着递归算法。我曾经用以下代码填tree:procedure TForm1.FillAffair();var NodeS, NodeC:TTreeNode; Count, No:Integer; AffairName, AffairSort, AffairStatus:string; FindOutS, FindOutC:boolean;begin //清空Tree TVAffair.Items.Clear; NodeS:=nil; NodeC:=nil; //到数据的第一条 ADODSA1.First; //锁定视图 TVAffair.Items.BeginUpdate; //循环处理数据 while not ADODSA1.Eof do begin //准备 AffairName:=ADODSA1.FieldByName('AffairName').AsString; AffairSort:=ADODSA1.FieldByName('AffairSort').AsString; AffairStatus:=ADODSA1.FieldByName('AffairState').AsString; Count:=TVAffair.Items.Count; No:=0; FindOutS:=False; FindOutC:=False; //查找有无父节点(种类) while No<=Count-1 do begin NodeS:=TVAffair.Items[No]; if (TVAffair.Items[No].Text=AffairStatus)and(TVAffair.Items[No].Level=0) then begin FindOutS:=True; Break; end; No:=No+1; end; //找到父节点 if FindOutS=True then begin //查找有无种类节点(种类) while No<=Count-1 do begin NodeC:=TVAffair.Items[No]; if (TVAffair.Items[No].Text=AffairSort)and(TVAffair.Items[No].Level=1) then begin FindOutC:=True; Break; end; No:=No+1; end; //找到种类节点 if FindOutC=True then NodeC:=TVAffair.Items.AddChild(NodeC, AffairName) //没找到种类节点 else begin NodeC:=TVAffair.Items.AddChild(NodeS, AffairSort); NodeC:=TVAffair.Items.AddChild(NodeC, AffairName); end; end //没找到状态节点 else begin NodeS:=TVAffair.Items.AddChild(nil, AffairStatus); NodeC:=TVAffair.Items.AddChild(NodeS, AffairSort); NodeC:=TVAffair.Items.AddChild(NodeC, AffairName); end; ADODSA1.Next; end; //解除锁定视图 TVAffair.Items.EndUpdate;end;总共有三级node
 
没有必要用递归。应该用动态加载树的方法,没有必要一次就把全部的数据加载到树。1:显示时,加载第一级树节点,并且在第一级节点下都加个子节点(标志节点,让一级节点有展开动作)2:在treeview的展开事件里做以下事情: 1:删除标志节点 2:加载对应的子节点。具体方法你得自己研究研究。一般会用到节点的Dada属性。如果你选择这种方法,我可以提供我的一些做法。
 
谢谢各位,我已经利用递归的方法解决了,不过unjiang仁兄的方法,显示的速度更快。小弟受益啦,十分感激!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部