ID    Name  ParentID
1     a      0
2     b      1
3     c      1
4     d      1
5     e      2
6     f      2
7     g      3
8     h      3
9     i      3
...   ...    ...
如上是树表table1的内容,即ID是每条记录的关键字,Name是树节点显示的内容,ParentID是该节点的父节点的ID
让它升成一个树。
要求:不要用递归!!!
求解!!!

解决方案 »

  1.   

    未测试,应该没错type
      PRecX=^TRecX;
      TRecX=record
       Id,Pid:integer;
       Name:string;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      fNode:TTreeNode;
      P:PRecX;  function FindParentID(PId:Integer):TTreeNode;
      var
        i:Integer;
      begin
        if Pid<>0 then
        with TreeView1.Items do
        for i:=0 to Count-1 do
        if Assigned(Item[i].Data) and (PRecX(Item[i].Data)^.Id=PId) then
        begin
          Result:=Item[i];
          Exit;
        end;    Result:=nil;
      end;begin
      with adoquery1 do
      begin
        close;
        sql.text:='select id,ParentID,[Name] from t order by ParentID,ID';
        open;
        while not eof do
        begin
          New(P);
          P^.Id:=FieldByName('id').AsInteger;
          P^.Pid:=FieldByName('ParentID').AsInteger;
          P^.Name:=FieldByName('Name').AsString;
          fNode:=FindParentID(P^.Pid);
          if fNode=nil then
             TreeView1.Items.AddObject(nil,P^.Name,P)
          else
             TreeView1.Items.AddChildObject(fNode,P^.Name,P);
          next;
        end;
      end;
    end;
      

  2.   

    如果是从数据库读取出来的话,用DEV系列控件CXTREELIST的话不用写一句代码,只需要设置
    KeyFields: 子节点ID
       
    DisplayFields:节点显示内容
       
    ParentFields:父节点ID就可以了,treeview要实现这个功能的话,网上很多这个例子,
      

  3.   

    我用的是cxTreeView这个控件呀,怎么弄?