在窗体上有一个TreeView控件,其子项标题由一数据表中“部门名称”填充,
TreeView中子项的不确定,不知道有多少层。
    数据表有“部门名称”,“父部门名称”,“子项标识”三个字段
    例如:
------------------------------------
| 部门名称 | 父部门名称 | 子项标识 |
------------------------------------
|   A      |  所有部门  |    T     |
------------------------------------
|   A1     |    A       |    T     | 
------------------------------------
|   B2     |    B       |    F     |
------------------------------------
|   A11    |    A1      |    F     |
------------------------------------
|   B      |  所有部门  |    T     |
------------------------------------
    “子项标识”表示这个部门还有没有子部门。
    具体情况和上表是一样的,所有部门是最顶层,部门A和部门B是它的子项,
而部门A1是部门A的子层,A11是A1的子项,B2是部门B的子项。
    请高手们帮个忙,如何写代码,把表中的部门按顺序填入到TreeView控件中。
    下面代码只能填充第一层部门。
procedure TRenSiMainFrm.FormActivate(Sender: TObject);
var
  i: integer;
  sqlStr, bmnameStr: string;
begin
  TreeView1.Items.Clear;
  TreeView1.Items.Add(nil, '所有部门');
  //-->选择第一层部门的记录  sqlStr:= 'select * from BuMenItem where 所属部门=';
  sqlStr:= sqlStr + ''''+ TreeView1.Items[0].Text+'''';
  DataModule1.TreeViewADOQuery.SQL.Clear;
  DataModule1.TreeViewADOQuery.SQL.Add(sqlStr);
  DataModule1.TreeViewADOQuery.Open;
  DataModule1.TreeViewADOQuery.Active:= True;
  //-->增加第一层部门
  if DataModule1.TreeViewADOQuery.RecordCount >0 then
  begin
    for i:= 1 to DataModule1.TreeViewADOQuery.RecordCount do
    begin
      bmnameStr:= DataModule1.TreeViewADOQuery.FieldByName('部门名称').AsString;
      TreeView1.Items.AddChild(TreeView1.Items[0], bmnameStr);
      DataModule1.TreeViewADOQuery.Next;
    end;
  end;
end;

解决方案 »

  1.   

    动态建立子项..
    然后用COLUMN属性对其进行分列..
      

  2.   

    用dxdbtreeview
    Dev Express套件里面的,直接设置好字段就可以了,完全支持你要的功能
      

  3.   

    你如果知道一个节点,就可以知道它的父节点、子节点,然后写入TreeView就可以了。
      

  4.   

    添加子节点递归调用
    procedure Tfrm_OrganizeM.AddChildNode(CurrentNode: TTreeNode) ;
    var
      ChildNode : TTreeNode;
      Q_Temp :  TADOQuery;
      NodeText ,父部门编号,tvDepCaption: String;
    begin
      NodeText := CurrentNode.Text;
      父部门 := Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
      Q_Temp :=TADOQuery.Create(nil);
      Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
      Q_Temp.SQL.Add('Select 部门编号,部门名称 From Dep Where 父部门编号='+ 父部门编号);
      Q_Temp.Open;
      if  Q_Temp.IsEmpty then
      begin
        Q_Temp.Free;
        Exit;
      end;
      while not Q_Temp.Eof do
      begin
        tvDepCaption := Q_Temp.FieldbyName('部门名称 ').AsString  +'['+ Q_Temp.FieldbyName('部门编号').AsString+']';
        ChildNode := tvOrganize.Items.AddChild(CurrentNode,tvDepCaption);
        AddChildNode(ChildNode);
        Q_Temp.Next;
      end;
      Q_Temp.Free;
    end;删除子节点也需递归调用
    procedure Tfrm_MainForm.actDelDepExecute(Sender: TObject);
    var
      部门编号 ,NodeText: String;
    begin
      if Assigned(frm_OrganizeM.tvOrganize.Selected) then
      begin
        NodeText := frm_OrganizeM.tvOrganize.Selected.Text;
        部门编号:= Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
        if MessageDlg('是否删除部门:'+NodeText +'?', mtInformation, [mbYes, mbNo], 0) = mrYes then
        begin
          if DMEnterpriseInfo.Q_Dep.Locate('部门编号',部门编号,[]) then
          begin
            LocateDelDep(部门编号);
            DMEnterpriseInfo.Q_Dep.Delete;
          end;
        end
        else Exit;
        with frm_OrganizeM do
        begin
          RefreshOrganizeTree;
          if Assigned(tvOrganize.TopItem) then
          begin
            tvOrganize.TopItem.Expand(True);
          end;
        end;
      end
      else
      begin
        MessageDlg('请选择部门!', mtInformation,      [mbOk], 0);
      end;
    end;
      

  5.   

    //递归查询隶属部门/组编号删除
    procedure Tfrm_MainForm.LocateDelDep(Dep01 : String);
    var
      sDep01 : String;
      Q_Temp : TADOQuery;
    begin
      Q_Temp :=TADOQuery.Create(nil);
      Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
      Q_Temp.SQL.Add('Select * From Dep Where Dep06 = '+Dep01);
      Q_Temp.Open;
      if not Q_Temp.IsEmpty then
      begin
        while not Q_Temp.Eof do
        begin
          sDep01 := Q_Temp.FieldByName('Dep01').AsString;
          Q_Temp.Delete;
          LocateDelDep(sDep01);
        end;
      end
      else
      begin
        Q_Temp.Free;
        Exit;
      end;
      Q_Temp.Free;
    end;
      

  6.   

    Dep06 为父部门编号
    Dep01 为部门编号
      

  7.   

    示例:
    procedure TCustomerDM.WriteToTreeview(First:boolean;
            treename: Ttreeview;Fathernode:Ttreenode);
    var childnode:Ttreenode;    CusID:string;
        CusName:string;
        query:TAdoquery;
    begin
      Query:=Tadoquery.Create(owner);
      query.Connection:=ADOConnectionDM.ADOConnection1;
      query.LockType:=ltReadOnly;
      Cusname:=Adoqry.fieldbyname('Cusname).asstring;
      treename.Items.BeginUpdate;
      if First  then
      begin
        treename.Items.Clear;
        Fathernode:=treename.Items.add(nil,Cusname); //N级的开始    
      end;
      if DisplayNextCus(query,ACusID) then //检索是否有下级
      begin
        while not query.Eof do
        begin
          CusName:=query.fieldbyname('名称').asstring;
          Childnode:=treename.Items.addchild(Fathernode,Cusname);   //N+1级
          WriteToTreeview(false,treename,childnode);
          query.next;
        end;
      end;
      query.Destroy;
      treename.Items.EndUpdate;
    end;