我的数据库表test 字段 id ,parentid ,text 
怎么才能将 数据库中的数据显示在树上。利用递归算法。
 
分不够可以额外开贴 谢谢 了

解决方案 »

  1.   

    转贴下,供参考:procedure AddSectionIntoView(SectionView: TTreeView1; ImageIndex: integer;
                ParentNode: TTreeNode; OwnerForm: TForm; ParentID:string);
    var
      TempQuery: TADOQuery;
      CurrNode: TTreeNode;
    begin
      TempQuery := TADOQuery.Create(OwnerForm);
      try
        TempQuery.Connection := FormMain.ADOConnection1;
        TempQuery.Close;
        TempQuery.SQL.Text := 'select * from SectionInfo where ParentID=:ParentID';
        TempQuery.Parameters[0].Value := ParentID;
        TempQuery.Open;
        if TempQuery.RecordCount > 0 then
        begin
          TempQuery.First;
          while not TempQuery.Eof do
          begin
            CurrNode := SectionView.Items.AddChild(ParentNode,TempQuery.FieldValues['SectionName']);
            CurrNode.ImageIndex := ImageIndex;
            CurrNode.SelectedIndex := ImageIndex;
            AddSectionIntoView(SectionView,ImageIndex,CurrNode,OwnerForm,TempQuery.FieldValues['SectionID']);
            TempQuery.Next;
          end;
        end;
      finally
        TempQuery.Free;
      end;
    end;
      

  2.   

    递规过程:
    procedure Form1.AddClass(AId: integer;FatherNode:TTreeNode);
    var
      QryTmp:TADOQuery;
      myNode:TTreeNode;
      myLabel:TLabel;
    begin
      QryTmp:=TADOQuery.Create(self);
      QryTmp.Connection:=DM.ADOConn;
      QryTmp.SQL.Add('select * from Test');
      QryTmp.SQL.Add('where parentid='+inttostr(AId));
      QryTmp.Open;
      while not QryTmp.Eof do
        begin
          myNode:=Treeview1.Items.AddChild(FatherNode,Trim(QryTmp.fieldbyname('text').AsString));
          //创建标签,caption存放各分支的AutoId表识
          myLabel:=TLabel.Create(self);
          myLabel.Visible:=false;
          myLabel.Caption:=QryTmp.fieldbyname('id').AsString;
          myNode.Data:=myLabel;
          AddClass(QryTmp.fieldbyname('id').AsInteger,myNode); //递归调用过程
          QryTmp.Next;
        end;
      QryTmp.Free;
    end;调用:设根结点的parentid=0
    procedure TForm1.FormShow(Sender: TObject);
    begin
      Treeview1.Items.Clear;
      AddClass(0,nil);
      TreeView1.FullExpand;
    end;
      

  3.   

    怎样根据数据库的内容动态部门树 *****
    主要解答者: zswangII 提交人: dulei115 
    感谢: dulei115 
    审核者: l_xiaofeng 社区对应贴子: 查看 
    -----------------------------------
    数据库结构:  
    部门ID      部门名称    上级部门ID  
       1            总部门            -1  
       2            部门1                1  
       3            部门2                1  
       4            部门3                1  
       5            分部门1            2  
       6            分部门2            2  
       7            分部门3            2  
       8            子部门1            5  
       9            子部门1            5  
     ---------------------------------------------------------------  
    (*//  
    标题:数据集处理成可视树  
    说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构  
    设计:Zswang  
    日期:2002-05-20  
    支持:[email protected]  
    //*)  
    ///////Begin  Source  
    function  DataSetToTreeNode(mDataSet:  TDataSet;  
       mFieldNameParent:  string;  //父节点标识字段名  
       mFieldNameTreeText:  string;  //节点文本字段名  
       mFieldNameTreeId:  string;  //节点标识字段名  
       mTreeView:  TTreeView;  mTreeNode:  TTreeNode;  
       mParentText:  string):  Boolean;  
    var  
       vTreeNode:  TTreeNode;  
       vFieldValues:  Variant;  
       vFieldNames:  string;  
    begin  
       Result  :=  False;  
       if  not  Assigned(mDataSet)  then  Exit;  
       if  not  Assigned(mTreeView)  then  Exit;  
       if  not  mDataSet.Active  then  Exit;  
       vFieldNames  :=  Format('%s;%s;%s',  
           [mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId]);  
       mDataSet.Filtered  :=  False;  
       mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);  
       mDataSet.Filtered  :=  True;  
       if  mDataSet.RecordCount  =  0  then  Exit;  
       mDataSet.First;  
       while  not  mDataSet.Eof  do  begin  
           vTreeNode  :=  mTreeView.Items.AddChild(mTreeNode,  
               mDataSet.FieldByName(mFieldNameTreeText).AsString);  
           vFieldValues  :=  mDataSet[vFieldNames];  
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,  
               mFieldNameTreeId,  mTreeView,  vTreeNode,  
               mDataSet.FieldByName(mFieldNameTreeId).AsString);  
           ///////Begin  恢复位置  
           mDataSet.Filtered  :=  False;  
           mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);  
           mDataSet.Filtered  :=  True;  
           mDataSet.Locate(vFieldNames,  vFieldValues,  []);  
           ///////End  恢复位置  
           mDataSet.Next;  
       end;  
       Result  :=  True;  
    end;  
    ///////End  Source  
    ///////Begin  Demo  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    begin  
       TreeView1.Items.Clear;  
       DataSetToTreeNode(Table1,  'ParentTreeId',  'TreeText',  'TreeId',  
           TreeView1,  nil,  'NULL');  
    end;  
    ///////End  Source  
    //---------------------------------------------------------------------------  
    //Borland  C++  Builder  
    //---------------------------------------------------------------------------  
    ///////Begin  Source  
    bool  DataSetToTreeNode(TDataSet*  mDataSet,  
       AnsiString  mFieldNameParent,  //父节点标识字段名  
       AnsiString  mFieldNameTreeText,  //节点文本字段名  
       AnsiString  mFieldNameTreeId,  //节点标识字段名  
       TTreeView*  mTreeView,  TTreeNode*  mTreeNode,  
       AnsiString  mParentText)  
    {  
       TTreeNode*  vTreeNode;  
       Variant  vFieldValues;  
       AnsiString  vFieldNames;  
       if  (mDataSet  ==  NULL)  return  false;  
       if  (mTreeView  ==  NULL)  return  false;  
       if  (!mDataSet->Active)  return  false;  
       vFieldNames  =  Format("%s;%s;%s",  
           ARRAYOFCONST((mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId)));  
       mDataSet->Filtered  =  false;  
       mDataSet->Filter  =  Format("%s=%s",  ARRAYOFCONST((mFieldNameParent,  QuotedStr(mParentText))));  
       mDataSet->Filtered  =  true;  
       if  (mDataSet->IsEmpty())  return  false;  
       mDataSet->First();  
       while  (!mDataSet->Eof)  {  
           vTreeNode  =  mTreeView->Items->AddChild(mTreeNode,  
               mDataSet->FieldByName(mFieldNameTreeText)->AsString);  
           vFieldValues  =  mDataSet->FieldValues[vFieldNames];  
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,  
               mFieldNameTreeId,  mTreeView,  vTreeNode,  
               mDataSet->FieldByName(mFieldNameTreeId)->AsString);  
           ///////Begin  恢复位置  
           mDataSet->Filtered  =  false;  
           mDataSet->Filter  =  Format("%s=%s",  ARRAYOFCONST((mFieldNameParent,  QuotedStr(mParentText))));  
           mDataSet->Filtered  =  true;  
           mDataSet->Locate(vFieldNames,  vFieldValues,  TLocateOptions());  
           ///////End  恢复位置  
           mDataSet->Next();  
       };  
       return  true;  
    }  /*  DataSetToTreeNode  */  
    ///////End  Source  
    ///////Begin  Demo  
    void  __fastcall  TForm1::Button1Click(TObject  *Sender)  
    {  
       TreeView1->Items->Clear();  
       DataSetToTreeNode(Table1,  "UpperTreeId",  "TreeName",  "TreeId",  
           TreeView1,  NULL,  "NULL");  
    }  
    ///////End  Demo  
     
    //当前如下调用~~  
     
    begin  
       TreeView1.Items.Clear;  
       DataSetToTreeNode(ADOTable1,  '上级部门ID',  '部门名称',  '部门ID',  
           TreeView1,  nil,  '-1');  
       ADOTable1.Filter  :=  '';    
    end;  
     
      

  4.   

    >>建议不要一次遍历因为这样往往速度较慢我不觉得有哪家单位会有上万个部门