求動態在TTreeView中遞歸生成節點的例子,層數無限制
數據庫如下
ID Name ParentID
1 AAA 0
2 BBB 1
3 CCC 1
4 DDD 2
5 EEE 2
6 FFF 3

解决方案 »

  1.   

    按ParentID从小到大排序,然后一个一个加入(先查找ParentID所在的节点)
    一个循环就够了
      

  2.   

    procedure CreateTree(var ANode : TTreeNode; var pid : integer);
    var
      id : integer;  
      sname : string;
      bmk : TBookMark;
    begin
      with form1,Query1 do
      begin
        filter := 'parentid=' + inttostr(pid);
        while not Eof do
        begin
          sname := FieldByName('name').AsString;
          Anode := Treeview.Items.AddChild(Anode, sname);
          id := FieldByName('ID').AsInteger;
          bmk := GetBook;
          CreateTree(ANode,id );
          Anode := Anode.Parent;
          filter := 'parentid=' + inttostr(pid);
          if Query1.BookValid( bmk ) then
          begin
            GotoBook(bmk);
            FreeBook(bmk);
          end;
          next;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      t : TTreeNode;
      Id : integer;
    begin
      query1.SQL.Add('select * from ttreeview');
      query1.Open;
      query1.Filtered:=true;  
      treeview.Items.clear;
      t := nil; 
      id := 0;
      createtree(t,id);
    end;
      

  3.   

    参考
    with rationdatamodule.gcquery do
       begin
          close;
          sql.Clear;
          sql.Add('select * from t_gcsm order by gcbh');
          prepared;
          open;
          first;
          if recordcount<>0 then
          begin
             for i:=1 to recordcount do
             begin
                gcm:=trim(fieldbyname('gcm').asstring);
                treeNodeparent:=TreeView1.Items.Add(nil,gcm);
                with rationdatamodule.demladoquery1 do
                begin
                   close;
                   sql.clear;
                   sql.Add('select * from t_deml where gcm=:gcm');
                   parameters.ParamByName('gcm').value:=gcm;
                   prepared;
                   open;
                   first;
                   if recordcount<>0 then
                   begin
                      for j:=1 to recordcount do
                      begin
                         xjmc:=trim(fieldbyname('xjmc').asstring);
                         treeNodechild:=TreeView1.Items.Addchild(treeNodeparent,xjmc);
                         next;
                      end;
                   end;
                end;
                next;
             end;
       end;
    end;