在一张表里建一棵树。
Table->Field->Index_ID,Parent_ID,Field_Name
Index_ID:是指节点编号。
Parent_ID:是指父节点编号。
Field_Name:是指树的节点名。
____________________________________________
|___Index_Id_|___Parent_ID|____Field_Name__|
|_______1____|____0_______|____浙江省______|
|_______2____|____1_______|____杭州市______|
|_______3____|____1_______|____宁波市______|
|_______4____|____2_______|____西湖区______|
|_______5____|____0_______|____江苏省______|
|_______6____|____5_______|____扬州市______|
|_______7____|____5_______|____苏州市______|
结果:
   +--浙江省
   |  |__杭州市
     |   |   |__西湖区
     |   |__宁波市
   |
     +----江苏省
         |__扬州市
     |__苏州市 
谢谢!,写得详细点。

解决方案 »

  1.   

    遍历整个表,如果PARENT_ID字段的值为0,则创建根节点,如果不是0,则找到INDEX_ID为PARENT_ID值的节点,创建一个字结点,依次类推
      

  2.   

    procedure  TForm1.newtreeview(Node:TTreeNode;ParentID:integer);
    var
      tmpNode : TTreeNode;
      ADOquery1 : TADOQuery;
    begin
      ADOQuery1 := TADOQuery.Create(self);
      ADOQuery1.Connection := ADOConnection1;
      ADOQuery1.close;
      ADOQuery1.SQL.clear;
      ADOQuery1.SQL.Text := 'select * from Table where Parent_ID ='+inttostr(ParentID);
      ADOQuery1.open;
      if ADOQuery1.recordcount > 0  then
      begin
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
          tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('Field_Name').AsString);
          Newtreeview(tmpNode,ADOQuery1.FieldByName('Index_ID').AsInteger);
          ADOQuery1.next;
          //dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
        end;
      end;
      ADOQuery1.Free;
    end;
      if Treeview1.Items<>nil then
        Treeview1.Items.Clear;
      newtreeview(nil,ADOTable1.FieldByName('Parent_ID').AsInteger);http://expert.csdn.net/Expert/topic/2281/2281015.xml?temp=.5998346
      

  3.   

    type
      PMyRecord = ^MyRecord;
      MyRecord = record
               ID : integer;
               name:string;
               ParentID : integer;
               end;//end of recordprocedure  TForm1.newtreeview(Node:TTreeNode;ParentID:integer);
    var
      tmpNode : TTreeNode;
      ADOquery1 : TADOQuery;
      p : PMyRecord;
    begin
      ADOQuery1 := TADOQuery.Create(self);
      ADOQuery1.Connection := ADOConnection1;
      ADOQuery1.close;
      ADOQuery1.SQL.clear;
      ADOQuery1.SQL.Text := 'select * from 部门表 where 上级部门ID='+inttostr(ParentID);
      ADOQuery1.open;
      if ADOQuery1.recordcount > 0  then
      begin
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
          new(p);
          p.ID := ADOQuery1.FieldByName('ID').AsInteger;
          p.name := ADOQuery1.FieldByName('部门名称').AsString;
          p.ParentID := ADOQuery1.FieldByName('上级部门ID').AsInteger;
          tmpNode := TreeView1.Items.AddChildObject(Node,p.name,p);
          Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsInteger);
          ADOQuery1.next;
          //dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
        end;
      end;
      ADOQuery1.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Treeview1.Items<>nil then
        Treeview1.Items.Clear;
      newtreeview(nil,ADOTable1.FieldByName('上级部门ID').AsInteger);
    end;
      

  4.   

    var
      aq1, aq2, aq3: TADOQuery;
      node, n1, n2: TTreeNode;
    begin
      aq1 := TAdoQuery.creat(Application);
      aq2 := TADOQuery.create(Application);
      aq3 := TADOQuery.create(Application);
      aq1.close;
      aq1.sql.clear;
      aq1.sql.add('select * from t where Parent_ID = 0');
      aq1.open;
      treeview.items.clear;
      treeview.items.beginupdate;
      while not aq1.eof do
      begin
        node := treeview.items.add(nil,aq1.FieldByName('Field_Name').asstring);
        aq2.close;
        aq2.sql.clear;
        aq2.sql.add('select * from t where Parent_ID = ' + '''' + aq1.FieldByName('Index_ID').asstring + '''');
        aq2.open;
        while not aq2.eof do
        begin
          n1 := treeview.items.addchild(node, aq2.FieldByName('FieldName').asstring);
          aq3.close;
          aq3.sql.clear;
          aq3.sql.add('select * from t where Parent_ID = ' + '''' + aq2.FieldByName('Index_ID').asstring + '''');
          aq3.open;
          while not aq3.eof do
          begin
            n2 := treeview.items.addchild(n1, aq3.FieldByName('FieldName').asstring);
            aq3.next;
          end;
          aq2.next;
        end;
        aq1.next;
      end;
    end;
          
        
      

  5.   

    以Index_Id和Parent_ID排序,
      遍历整个表
        循环查找树节点,节点最好是代码加名称,只判断代码比较好。
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j,i1,j1:integer;
      s,s1:string;
      n:integer;
      tr:TTreeView;
    begin
      form1.Table1.Open;
      form1.Table1.First;
      i:=form1.Table1.RecordCount;
      if i>0 then
      begin
        for j:=0 to i-1 do
        begin
          s:=form1.Table1.FieldValues['field_name'];
          n:=form1.Table1.FieldValues['parent_id'];
          if n=0 then
            form1.TreeView1.Items.Add(nil,s)
          else
          begin
            form1.Query1.Close;
            form1.Query1.SQL.Clear;
            form1.Query1.SQL.Add('select * from tablename');
            form1.Query1.Open;
            s1:=form1.Query1.FieldValues['field_name'];
            i1:=form1.TreeView1.Items.Count;
            if i1>0 then
            begin
              for j1:=0 to i1-1 do
              begin
                if form1.TreeView1.Items.Item[j1].Text=s1 then
                  form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[j],s1);
              end;
            end;
          end;
        end;
      end;
    end;
      

  7.   

    TO:dulei115 
    老兄,我按你的思路来做,没有成功呀,我只能创建以下
    例:浙江省
        杭州市
          西湖区
    但是我的
        宁波市
         江苏省
             扬州市
         苏州市
    都没有创建成功呀,这是怎么回事。
    我觉得好像是递归执行Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsInteger);
    就没有执行 ADOQuery1.next;
    就直接退出来。
    请问这是什么问题
      

  8.   

    procedure  TForm1.newtreeview(Node:TTreeNode;ParentID:integer);
    var
      tmpNode : TTreeNode;
      ADOquery1 : TADOQuery;
    begin
      ADOQuery1 := TADOQuery.Create(self);
      ADOQuery1.Connection := ADOConnection1;
      ADOQuery1.close;
      ADOQuery1.SQL.clear;
      ADOQuery1.SQL.Text := 'select * from table where Parent_ID ='+inttostr(ParentID);
      ADOQuery1.open;
      if ADOQuery1.recordcount > 0  then
      begin
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
          tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('Field_Name').AsString);
          Newtreeview(tmpNode,ADOQuery1.FieldByName('Index_ID').AsInteger);
          ADOQuery1.next;
        end;
      end;
      ADOQuery1.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      newtreeview(nil,0);
    end;
    ///////////////////////////////
    刚刚试了一下是好的,楼主可能其他地方有问题
      

  9.   

    用Dev的dbtree的控件,速度快!当数据多了的时候它的优势就出来了