数据库中的记录如下:  
id    Type    Name  
 1    aaa      12121  
 2    bbb      asdasd  
 3    ccc      fdsfsdf  
 4    bbb      2342  
 5    aaa      dfffaf  
 6    ccc      ffesfsf  
实现下面效果:  
 
+  类型汇总  
     ¦  
   +  -----aaa  
     ¦        ¦____12121  
     ¦        ¦____dfffaf  
   +  -----bbb  
     ¦        ¦____asdasd  
     ¦        ¦____2342  
   +  -----ccc  
             ¦____fdsfsdf  
             ¦_____ffesfsf  
 
   我用的是  Query1  控键,根节点下的附节点可以找出来,可以附节点下的子节点找不出来,请教各位高手!谢谢! (例子也行) 

解决方案 »

  1.   

    procedure Tda.xlmcClick(Sender: TObject);
    var
        nodecel : array[0..10] of TtreeNode;
        sqlstr,s1,s2:string;
        tempstr :array[0..10] of string;
        tempBoolean :array[0..10] of Boolean;
        Nodetitle :TtreeNode;
    begin
        if (xlmc.text='') or (wz.text='') then begin
            
            exit;
        end;
        screen.Cursor:=crHourGlass;
        if Sender<>cmdok then
            key.Text:='0';
        TreeView1.Items.Clear;
        TreeView1.Items.BeginUpdate;
        new(nodeid);
        dispose(nodeid);
        nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text);
        nodecel[0].ImageIndex := 0;
        nodecel[0].SelectedIndex := 3;
        if wz.text<>'全部' then
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from  绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米'
        else
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号';
        ADODataSet1.commandtext:=sqlstr;
        ADODataSet1.open;
        while not ADODataSet1.eof  do
        begin
            tempBoolean[1]:=false;
            s1:=ADODataSet1.FieldByName('首桩号').AsString;
            s2:=ADODataSet1.FieldByName('首桩米').AsString;
            if ADODataSet1.FieldByName('首桩米').asinteger=0 then
                sqlstr:= s1
            else
                if ADODataSet1.FieldByName('首桩米').asinteger>0 then
                    sqlstr:= s1 +'(+'+s2+')'
                else
                    sqlstr:= s1 +'('+s2+')';
            sqlstr:= sqlstr+'--';
            s1:=ADODataSet1.FieldByName('尾桩号').AsString;
            s2:=ADODataSet1.FieldByName('尾桩米').AsString;
            if ADODataSet1.FieldByName('尾桩米').asinteger=0 then
                sqlstr:= sqlstr+s1
            else
                if ADODataSet1.FieldByName('尾桩米').asinteger>0 then
                    sqlstr:= sqlstr+s1 +'(+'+s2+')'
                else
                    sqlstr:= sqlstr+s1 +'('+s2+')';
            if wz.text='全部' then
                begin
                if (tempstr[1] <>sqlstr) then
                    begin
                    tempstr[1] :=sqlstr;
                    nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]);
                    nodecel[1].ImageIndex := 1;
                    nodecel[1].SelectedIndex := 3;
                    end;
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end
            else
                begin
                if (tempstr[1] <>sqlstr) then
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end;
            ADODataSet1.Next;
        end;
        nodecel[0].Expanded := True;
        ADODataSet1.close;
        ADODataSet1.CursorLocation:=clUseClient;
        ADODataSet1.CursorType:=ctDynamic;
        ADODataSet1.LockType:=ltOptimistic;
        TreeView1.Items.endUpdate;
        screen.Cursor:=crDefault;
    end;
      

  2.   

    procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
    var  mLocalName: string;
    TreeNode: TTreeNode;
    Ads_Tmp: TADODataSet;
    begin
    ADS_Tmp := TADODataSet.Create(Self);
    ADS_Tmp.Connection := ADOConn;
    with ADS_Tmp do
    begin
       Close;
       CommandText := 'Select * from Type Where ParentID =' + FNodeName;
       Open;
       First;
       while not Eof do
       begin
       mLocalName := FieldbyName('ID').Asstring;
       TreeNode := TreeView.Items.AddChild(Node, FieldByName('Name').AsString);
       CreateSubTree(mLocalName, TreeNode);
       Next;
       end;
      end;
    end;
    一个低归函数
      

  3.   

    给你一个例子
    procedure TForm1.FormShow(Sender: TObject);
    var
      i,j:integer;
      s:string;
      node,subnode:ttreenode;
    begin
      node:=form1.TreeView1.Items.Add(nil,'班级管理');
      node.SelectedIndex:=0;
      dm.Table1.Open;
      i:=dm.Table1.RecordCount;
      if i>0 then
      begin
        for j:=0 to i-1 do
          begin
            s1:=dm.Table1.FieldValues['班级名称'];//+'['+dm.Table1.FieldValues['届']+']';
            s2:=dm.Table1.FieldValues['届'];
            s:=s1+'['+s2+'届]';
            subnode:=form1.TreeView1.Items.AddChildObject(node,s,nil);
            subnode.SelectedIndex:=dm.Table1.RecNo+1;
            form1.TreeView1.Items.AddChildObject(subnode,'学生基本信息',nil);
            form1.TreeView1.Items.AddChildObject(subnode,'学生成绩',nil);
            form1.TreeView1.Items.AddChildObject(subnode,'宿舍安排',nil);
            form1.TreeView1.Items.AddChildObject(subnode,'班干部信息',nil);
            form1.TreeView1.Items.AddChildObject(subnode,'班级大事记',nil);
            dm.Table1.Next;
          end;
      end;