现在我有一个数据库Test(数据借用) 
表结构和数据如入: 
ID           Name         ParentID 
1             中国人     00000000 
2             浙江人     1 
3             湖北人     1 
4             杭州人     2 
5             绍兴人     2 
6             武汉人     3 
7             荆门人     3 
8             美国人     00000000 
9             纽约人     8 
10           华盛顿人8 
11           曼哈顿人9 
---看了些,实现的方法都不理想

解决方案 »

  1.   

    使用DBTree等控件,比如cxDBTreeList
      

  2.   

    Procedure DrawTreeTop(TreDest : TtreeView;QryDest:TAdoquery;
                          FieldCode,FieldName,fieldLevel:String);
    var
       NodTop,Nodselect: Ttreenode;
       MyTree : PDrawTree;
       QryTmp:Tadoquery;
    begin
         QryTmp:=Tadoquery.Create(Nil);
         QryTmp.Connection:=QryDest.Connection;
         QryTmp.sql.text:=QryDest.Sql.text;
         Try
             QryTmp.open;         TreDest.Items.Clear;
             New(Mytree);
             Mytree.Code:='';
             Mytree.Name:='全部';
             TreDest.Items.AddChildObject(nil,Mytree.Name,Tobject(Mytree));
             NodTop:=TreDest.TopItem;
             NodTop.ImageIndex:=0;
             NodTop.SelectedIndex:=0;
             QryDest.Filtered:=False;
             QryDest.Filter:=fieldLevel+'=1';
             QryDest.Filtered:=True;
             QryDest.First;
             while not QryDest.eof do
             begin
                 New(Mytree);
                 Mytree.Code:=QryDest.fieldbyname(FieldCode).asstring;
                 MyTree.Name:=QryDest.fieldbyname(FieldName).asstring;
                 Nodselect:=TreDest.Items.AddChildObject(NodTop,'【'+Mytree.Code+'】'
                                                       +MyTree.Name,Tobject(Mytree));
                 DrawTreeAll(TreDest,QryTmp,FieldCode,FieldName,
                              fieldLevel,Nodselect);
                 If Nodselect.HasChildren Then
                 Begin
                    Nodselect.ImageIndex:=0;
                    Nodselect.SelectedIndex:=2;
                 End
                 else
                 Begin
                    Nodselect.ImageIndex:=1;
                    Nodselect.SelectedIndex:=3;
                 end;
                 QryDest.Next;
              End
          finally
             QryTmp.Free;
          end;
          If QryDest.Filtered Then
              QryDest.Filtered:=False;
        // treDest.FullExpand;
    end;
    Procedure DrawTreeAll(TreDest : TtreeView;QryDest:TAdoquery;
                          FieldCode,FieldName,fieldLevel:String;parNode:TtreeNode);Var
       MyTree:PDrawTree;
       Node : TtreeNode;
       i:Integer;
    Begin
        QryDest.Filtered:=False;
        QryDest.Filter:=FieldCode+' like '''+PDrawTree(ParNode.Data)^.Code+'*'+''' and '
                        +fieldLevel+'='+Inttostr(parNode.level+1);
        QryDest.Filtered:=True;
        QryDest.first;
        While Not QryDest.Eof Do
        Begin
               New(MyTree);
               MyTree.code:=QryDest.fieldbyname(FieldCode).asstring;
               MyTree.name:=QryDest.fieldbyname(FieldName).asstring;
               Node:=TreDest.Items.AddChildObject(ParNode,'【'+MyTree.Code+'】'
                                             +MyTree.Name,Tobject(MyTree));
               QryDest.Next;
           end;
           For i:=0 To  ParNode.Count-1 Do
           Begin
               DrawTreeAll(TreDest,QryDest,
                          FieldCode,FieldName,fieldLevel,ParNode.Item[i]);
                 If ParNode.Item[i].HasChildren Then
                 Begin
                    ParNode.Item[i].ImageIndex:=0;
                    ParNode.Item[i].SelectedIndex:=2;
                 end
                 else
                 Begin
                    ParNode.Item[i].ImageIndex:=1;
                    ParNode.Item[i].SelectedIndex:=3;
                 end;   
           end;
    end;
      

  3.   

    表结构CREATE TABLE [dbo].[表] (
    [tym_code] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [tym_name] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [tym_re] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
    [tym_level] [int] NOT NULL ,
    [tym_bottom] [bit] NULL 
    ) ON [PRIMARY]调用             QryType.Connection:=QryTmp.Connection;
                 QryType.close;
                 QryType.Sql.text:='Select * from '+TypeTable ;
                 QryType.open;
                 DrawTreetop(Ttreeview,QryType,FieldCode,FieldName,FieldLevel);