编码     名称                      上级编码
---------------------------------------------------
A001     FFD                       S                      
A002     ADDF                      S
S        DSAFSSDF              
b001     sdakfsajkfj               A001
生成如下树形列表S   DSAFSSDF 
    A001        FFD
                b001     sdakfsajkfj   
    A002        ADDF 目前通过递归方式生成,速度有慢,有没有更快的方法,希望大家帮忙. 

解决方案 »

  1.   

    仅供参考:
    http://harryfin.spaces.live.com/blog/cns!31E57C5D97ECDF5!411.entry
      

  2.   

    如果是id,rootid,level,order这样的表结构,生成一棵树无须递归
    但是,代价是增删改时,需要update多条记录
      

  3.   

    procedure TFormPetTest.BuildTree(Treeview: TTreeView; const Field_ID,
      Field_PID, Field_caption: WideString);
    var
      vNode: TTreeNode;
      vPNode: TTreeNode;
      vList: TStringList;
      vIndex: integer;
    begin
      TreeView.Items.BeginUpdate;
      vList := TStringList.Create;
      vList.Sorted := True;
      try
        with ADOQuery1 do
          if RecordCount > 0 then
          begin
            First;
            while not Eof do
            begin
              vNode := Treeview.Items.Add(nil, FieldByName(Field_caption).AsString);
              vList.AddObject(FieldByName(Field_ID).AsString, vNode);
              if vList.Find(FieldByName(Field_PID).AsString, vIndex) then
                vNode.MoveTo(TTreeNode(vList.Objects[vIndex]), naAddChild);
              next;
            end;
          end;
      finally
        vList.Free;
        Treeview.Items.EndUpdate;
      end;
    end;//自己试试!
    //调用方法:
    BuildTree(Treeview1,'编码','上级编码','名称');
      

  4.   

    前几天看到一个实现,也是使用了stringlist来辅助扫描定位,但是没有使用moveto但是转贴者想实现仅仅对某个节点(及其所有子节点)的加载,好像无法做到
      

  5.   

    递归效率低
    即使全部记录取到客户端内存,再递归,query的扫描也是不如stringlist的扫描的效率高
      

  6.   

    循环执行SQL递归是最慢的。
    将数据一次加载到一个List中,然后在整理成一个树的层次能快一些。
    在就是每次只加载展开的节点。
      

  7.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=3951307
      

  8.   

    昆腾控件DevExpress有现成的树形控件
    在关键字段跟父类字段名填上就可以了
      

  9.   


    procedure TFrmMain.Button1Click(Sender: TObject);
      procedure getStructrueInfo(vKeyID: string;tnode: TTreeNode);
      var
        oraQuery1: TOraQuery;
        Tnode1: TTreeNode;
      begin
        oraQuery1 := TOraQuery.Create(nil);
        oraQuery1.Session := oraSession1;
        try
          with oraQuery1 do
          begin
            close;
            if vKeyID='' then
            begin
              sql.Text := ' select bh,name,pbh from test_t where pbh is null order by bh';
            end else
            begin
              sql.Text := ' select bh,name,pbh from test_t where  pbh=:pbh order by bh';
              ParamByName('pbh').Value := vKeyID;
            end;
            Open;
            while not eof do
            begin
              if tnode=nil then
              begin
                if Trim(FieldByName('name').AsString)<>'' then
                  Tnode1 := TreeView1.Items.add(nil,FieldByName('name').AsString);
                Tnode1.ImageIndex := 0;
              end else
              begin
                if Trim(FieldByName('name').AsString)<>'' then
                  Tnode1 := TreeView1.Items.AddChild(tnode,FieldByName('name').AsString);
                 Tnode1.ImageIndex := 1;
              end;
              getStructrueInfo(FieldByName('bh').AsString,Tnode1);
              Next;
            end;
          end;
        finally
          oraQuery1.Free;
        end;
      end;
    begin
      TreeView1.Items.Clear;
      getStructrueInfo('',nil);
      TreeView1.FullExpand;
    end;
      

  10.   

    DevExpress
    控件里有树形控件啊
      

  11.   


    你这样
    那还不如直接用SQL显示出树形结构,就行了
    你这样还一次一次去SQL查询,这样SQL的成本不是更高?