tree 树状显示,急,帮帮忙,提高速度(100)

  • 主题发起人 主题发起人 leng0601
  • 开始时间 开始时间
L

leng0601

Unregistered / Unconfirmed
GUEST, unregistred user!
[red][/red]哪位大侠帮帮忙,显示1W条数据的树时打开好慢呀,怎么解决,加了BEGINUPDATA这种,也还是好慢,有没有其它什么好用速度快的控件 先打开父节点,再点其中一个再加子节点还是慢呀,如果子节点有个10000条还是不能解决问题
 
可以不全加载上去,单击某个结点时再加载上去。
 
先加载上根结点,然后图标是加号,单击这个结点时再加载,
 
选中某个节点后,加载显示子节点以及子节点的子节点,如果只是显示子节点,而不加载子节点的子节点,则操作员看不出来个子节点到底有无第三级子节点
 
楼上的,我的方法是可以的,单击某结点时只加载他的子结点,而不加载孙子结点,这时可以用haschild := TRUE来使这个结点图标为加号,使看起来以为还有子结点,单击子结点时,再去加载孙子结点。我实际用过的是可以的,我第一次先加载上根结点,然后再单击那个结点再一级一级地加载,速度不慢,我以前用dxdbtreelist控件来显示树,大数据量(10万多)数据时控件就瘫痪了。
 
没说你的不可以。---------------------这时可以用haschild := TRUE来使这个结点图标为加号,使看起来以为还有子结点,单击子结点时,再去加载孙子结点。------>如果这个节点本身没子节点,你把haschild := TRUE,不是误导操作员吗?------------------------------没有跟你斗气的想法,只是交流想法而已,别见怪,呵呵
 
不好意思阿,大侠,我也没有斗气的想法。别见怪。呵呵。Node.HasChildren := FieldByName('ISEND').AsInteger = 0; //加载子结点时是否有孙子结点是判断过的。数据表中有一个字段来区别是否是末级。procedure LoadTreeCurrentNode(id: string); //ID是单击时选中的结点的一个编号var Parent, Node: TTreeNode; Level: integer;begin if TreeView1.Selected.Count > 0 then Exit; //有孩子就不再展了 Parent := TreeView1.Selected; Level := Length(id) - Length(StringReplace(StringReplace(id, '$', '-', [rfreplaceall]), '-', '', [rfreplaceall])) + 1; with TmpQuery do begin Close; Connection := zs_dm.ado_xm; Sql.Clear; Sql.Add('select lxmc10 as id,xm2,gcode,case when level = (select level from (select max(level) as level from table1 where (level <> 66 and level <> 99) and lxmc10 like ''' + id + '%'') a ) then 1 else 0 end as isend from l_table1 _km where lxmc10 like ''' + id + '%'' and len(lxmc10)- len(replace(replace(lxmc10,''$'',''-''),''-'',''''))= ' + inttostr(Level) + ' order by lxmc10 asc '); try Open; except end; if IsEmpty then begin Exit; end; while not Eof do begin New(Mytreenode); Mytreenode^.id := FieldbyName('id').AsString; Mytreenode^.xm2 := FieldbyName('xm2').AsString; Mytreenode^.gcode := FieldbyName('gcode').AsString; Node := TreeView1.Items.AddChildobject(Parent, Mytreenode^.xm2, Mytreenode); Node.HasChildren := FieldByName('ISEND').AsInteger = 0; Next; end; end;end;
 
加载节点时统一加个临时子节点。临时节点做标记。如名称=“1特殊值”,或者使用data属性,其他节点有Data值,临时加的节点没有Data属性。(常用)节点展开事件判断如果子节点是临时节点,删除临时节点,再加载子节点。这是Windows的风格,缺点如znxia说的,有可能显示为“加号”,却没有子节点。如sql2005的管理器就是这风格。加载节点时多向下判断一级,即可解决以上问题,为了这个判断方便,最好在设计数据库时建一字段,表示该节点是否存在子节点,同时应该注意数据的变更时及时更新该字段的值。这个字段不及时更新直接导致子节点丢失。
 
hhjjhhjj说的在数据库中加字段标识是否有子结点的方法我觉得比较好,既可以只加一层结点,又可以看出有无子结点,有子结点的就用临时结点代替,展开时再真正加载子结点.
 
加加号前判断有没有孙子就可以了你可以用sql统计啊
 
先打开父节点,再点其中一个再加子节点还是慢呀,如果子节点有个10000条还是不能解决问题
 
如果子节点有1W条,那么这种情况就不该用Tree来导航了。
 
你的数据经常有变动吗?如果没有什么变动,则可以SAVETOFILE,加载时LOADFROMFILE这种方法很快的,前提是你的数据不发生变化。
 
"加加号前判断有没有孙子就可以了"这样做的缺点:加一个子节点就会对应一个查询,效率打折不少,也是可以的。看楼主的数据量大小了。
 
后退
顶部