我想做一个树形结构的查询功能,就是像CSDN一样的,我用了 ADODataSet控件连接SQL数据库,但是我的全面显示,没有下一级的
procedure TForm_department_staff.Button1Click(Sender: TObject);
const
  ID_DEPT = 2;
var
  nLevel: Integer;
  pNodes: array[0..1023] of TTreeNode;
  lpID, lpName: string;
begin
  ADODataSet1.Close;
  ADODataSet1.CommandText := 'SELECT * FROM department ORDER BY id';
  ADODataSet1.Open;
  pNodes[0] := nil;
  TreeView1.Items.Clear;
  with ADODataSet1.Recordset do
    while not Eof do
    begin
      lpID := Fields['id'].Value;
      lpName := Fields['department'].Value;
      nLevel := Length(lpID) div ID_DEPT;
      pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
      MoveNext;
    end;
end;
表department中有:01,财务部;02,销售部;0101,五精仓库;0201,成品仓库;010101,五精一队;我想显示成:
财务部
    五精仓库
        五精一队
销售部
    成品仓库但是显示的结果是:
财务部
五精仓库
五精一队
销售部
成品仓库全部在一级上,请各位大哥帮忙看看,还有就是我在点击显示结果的时候怎么把点击的数据传给一个文本

解决方案 »

  1.   

    拿这个做参考
    var   
            List:TStringList;   
            Node:TTreeNode;   
            Index:Integer;   
    ------------------------   
    cdstree.commandtext:= "SELECT   *   from   TABLE   ORDER   BY   上级ID,ID " 
        TreeView.Items.BeginUpdate;   
            try   
                    TreeView.Items.Clear;                   List:=       TStringList.Create;   
                    try   
                            List.Sorted:=       True;   
                            cdsTree.First;   
                            while       not       cdsTree.Eof       do   
                            begin   
                                    //如果是顶接点   
                                    if       cdsTree.FieldByName(   "你的上级ID   ").AsInteger=       0       then   
                                    begin   
                                            Node:=TreeView.Items.AddChild(nil,       cdsTree.FieldByName(mName).AsString)   
                                    end       else   
                                    begin   
                                            Index:=       List.IndexOf(cdsTree.FieldByName(   "你的上级ID   ").AsString);   
                                            Node:=       TreeView.Items.AddChildFirst(TTreeNode(List.Objects[index]),   
                                                    cdsTree.FieldByName(   "你的字段名称   ").AsString);   
                                    end;   
                                    List.AddObject(cdsTree.FieldByName(   "ID   ").AsString,       Node);   
                                    cdsTree.Next;   
                            end;   
                    finally   
                            List.Free;   
                            cdsTree.Close;   
                    end;   
            finally   
                    TreeView.Items.EndUpdate;   
            end;
      

  2.   

    procedure   TForm_department_staff.Button1Click(Sender:   TObject); 
    const 
        ID_DEPT   =   2; 
    var 
        nLevel:   Integer; 
        pNodes:   array[0..1023]   of   TTreeNode; 
        lpID,   lpName:   string; 
    begin 
        ADODataSet1.Close; 
        ADODataSet1.CommandText   :=   "SELECT   *   FROM   department   ORDER   BY   id "; 
        ADODataSet1.Open; 
        pNodes[0]   :=   nil; 
        TreeView1.Items.Clear; 
        with   ADODataSet1.Recordset   do 
            while   not   Eof   do 
            begin 
                lpID   :=   Fields[ "id "].Value; 
                lpName   :=   Fields[ "department "].Value; 
                 edit1.text:=lpid;
                nLevel   :=   Length(trim(edit1.text))   div   ID_DEPT; 
                pNodes[nLevel]   :=   TreeView1.Items.AddChild(pNodes[nLevel   -   1],   lpName); 
                MoveNext; 
            end; 
    end; 我已经解决了,发给大家,这个可以创建多层次的,代码也少,也易懂