我想建无限树,根据下表,“1,11”只是代表实际是中文名称
数据表
请提供思路和方法
谢谢
id    paraent   child        1         11     
        1         12
        11        111 
        11        112
        2         21
        2         22
        ...       ...

         1               2
   
   11          12      21  22 111   112
treeview
 1
    11
        111
        112
    12 2  21
    22

解决方案 »

  1.   

    var 
    i:integer;
    name:string;
    begin
    ....
    self.query1.close;
    self.query1.sql.clear;
    self.query1.sql.add(select substring(child,1,1) from table1 group up substring(child,1,1) order by substring(child,1,1));
    i:=1;
    repeat
         begin
           name:=Query1.FieldByName('Name').asstring;
          TreeView1.Items.AddChild(TreeView1.Selected, name).ImageIndex:=1;
           Query1.Next;
                i:=i+1;
           end;
     until i= Query1.RecordCount
    if TreeView1.selected.level=1 then
        begin
         self.query1.close;
    self.query1.sql.clear;
    self.query1.sql.add(select substring(child,1,2) from table1 group up substring(child,1,2) order by substring(child,1,2));
    i:=1;
    if self.RzTreeView1.Selected.HasChildren=false then
    repeat
         begin
           name:=Query1.FieldByName('Name').asstring;
          TreeView1.Items.AddChild(TreeView1.Selected, name).ImageIndex:=1;
           Query1.Next;
                i:=i+1;
           end;
         until i= Query1.RecordCount  
        end;
    end;
    if TreeView1.selected.level=2then
        begin
         self.query1.close;
    self.query1.sql.clear;
    self.query1.sql.add(select substring(child,1,3) from table1 group up substring(child,1,3) order by substring(child,1,3));
    i:=1;
    if self.TreeView1.Selected.HasChildren=false then
    repeat
         begin
           name:=Query1.FieldByName('Name').asstring;
          TreeView1.Items.AddChild(TreeView1.Selected, name).ImageIndex:=1;
           Query1.Next;
                i:=i+1;
           end;
         until i= Query1.RecordCount  
        end;
    end;
    ......
    end;楼主兄弟,如果你的数据库有规律的话,这一段小程序中的IF你可以用循环的,我就写这么一点,循环的条件,你自己想一下,都是在大同小异的!兄弟加油,为了我们共同的Delphi事业!
      

  2.   

    数据表里的数据值没有规律‘1,12‘只是代表
    to:dalang81(大狼) 有没有具体的算法代码
      

  3.   

    www.myjinsui.com/down
    中有一个我写的控件,你可以试试(DBtree)
      

  4.   

    控件不错
    不过我用的delphi5 能装吗谁还有好的算法
      

  5.   

    //库结构
      BG_ID varchar(50)//如:00010001
     BG_name varchar(50)
      BG_file image
    //
    procedure Tform_GCZL.addsublist;
    var
      i:integer;
      //ss:string;
    begin
      //添加子目录
      TreeView_main.Items[0].DeleteChildren;
      TreeView_main.Items[0].Text:='全部资料';
      TreeView_main.Items[0].ImageIndex:=0;
      with myadoq do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select a.BG_ID,a.BG_file,a.BG_name,a.isfile,(select count(bg_id) from mulu_file where BG_ID<=left(a.BG_ID,len(a.BG_ID)-4)) as theid from mulu_file a order by a.BG_ID');
        Open;
        for i:=0 to RecordCount-1 do
        begin
          TreeView_main.Items.AddChild(TreeView_main.Items[FieldByName('theid').asinteger],FieldByName('BG_name').AsString).Selected:=true;
          if Fieldbyname('isfile').AsInteger=1 then
          begin
            TreeView_main.Selected.ImageIndex:=3;
            TreeView_main.Selected.SelectedIndex:=3;
          end;
          if Fieldbyname('isfile').AsInteger=0 then
          begin
            TreeView_main.Selected.ImageIndex:=1;
            TreeView_main.Selected.SelectedIndex:=2;
          end;
          Next;
        end;
      end;
    end;
      

  6.   

    to  delphiseabird(沙鸥) 是不是BG_ID 要求有一定的规律才行我从别人那里找到
    一个递归建树的方法,任意值无需有规律,与大家分享
    procedure AddClass(AId: string; FatherNode: TTreeNode; temp_treeview: Ttreeview);
    var
      QryTmp: TADOQuery;
      myNode: TTreeNode;
      myLabel: TLabel;
    begin
      QryTmp := TADOQuery.Create(application);
      qrytmp.connection := form1.ADOConnection1;
      QryTmp.SQL.Add('select * from pro_bom');
      QryTmp.SQL.Add('where cp_peij_no=:AId');
      qrytmp.Parameters.ParamByName('aid').value := aid;
      QryTmp.Open;
      while not QryTmp.Eof do
      begin
        myNode := temp_Treeview.Items.AddChild(FatherNode, QryTmp.fieldbyname('wl_peij_no').AsString);
             //创建标签,caption存放各分支的AutoId表识
        myLabel := TLabel.Create(application);
        myLabel.Visible := false;
        myLabel.Caption := QryTmp.fieldbyname('wl_peij_no').AsString;
        myNode.Data := myLabel;
        AddClass(QryTmp.fieldbyname('wl_peij_no').Asstring, myNode, temp_treeview); //递归用过程
        QryTmp.Next;
      end;
      QryTmp.Free;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
        AddClass('all',nil,bosstreeview1);
    end;请大家继续讨论呀