数据库中的记录如下:
id  Type  Name
 1  aaa   aaa
 2  bbb   bbb
 3  ccc   ccc
 4  bbb   ddd
 5  aaa   fff
 6  ccc   ggg 
实现下面效果:类型汇总
+ -----aaa
    |__aaa
    |__fff
+ -----bbb
    |__bbb
    |__ddd
+ -----ccc
    |__ccc
    |___ggg请帮帮我????????

解决方案 »

  1.   

    其实,楼主这种树结构明显有一种父子关系的!所以,如果你改一下数据结构,将会极大的提高效率,甚至你可以不用编程都能创建这种树结构!我建议的结构如下:
    id  Type  Name  Parent(父节点的ID,0表示根节点)
     1  aaa   aaa    0
     2  bbb   bbb    0
     3  ccc   ccc    0
     4  bbb   ddd    2
     5  aaa   fff    1
     6  ccc   ggg    2
      

  2.   

    如果你按我上面的建议设置数据库结构的话,那么普通的DBTreeview控件就能完成你的要求!我曾试过几种方案,后来因为我的数据量太多了,用DbTreeView的效率不高,我就只好自己来组件树了!我有两种方案:
    1、一进窗体就把树组织起来,这种方法优点是窗体进入的时候较慢,但进入了以后就正常!
    了!
    具体到你的结构上,可以这样做:
    先加入一级节点:
    select name from 表  group by name
    这样你将可以加入 aaa,bbb,ccc三个节点了!
    然后你对根节点进行遍历,对每一个节点,取它的Caption,然后再用语句:
    select name from 表 where name=遍历根节点的值
    语句如下:
    var
      count:Integer
    begin
      with Query1 do
      begin
        close;
        sql.clear;
        sql.add('select name from 表  group by name');
        open;
        where not eof do
        begin
          treeview1.items.add(nil,fieldbyname('name').asstring);
          next;
        end;
    //根节点加完了,开始加子节点了    
        for count:=0 to Treeview1.items.count-1 do
        begin
    //
          if Treeview1.items[count].level=0 then
          begin
            close;
            sql.clear;
            sql.add('select name from 表 where name=:name')  
            parambyname('name').asstring:=Treeview1.items[count].caption;
            open;
            while not eof do 
            begin
    //加入子节点
              next;
            end;
          end; 
        end;
      end;
    end;
    2、在进入的时候只加入一级节点,当用户单击了某一个节点了后再组织这个节点的子节点。这样做的好处是速度快,而且简单。楼主你自己去试试,我就是这样做的呢!
      

  3.   

    我用你的语句试了下,type不同的可以列出来,但是相同的type下的name要列在type下就列不出来,不知何解。
        帮帮我,谢谢!
    我觉的"for count:=0 to Treeview1.items.count-1 do"以下的语句没有执行。