从数据库读取出数据,分两层,即父层子层。分别来自两个表。向做成树形结构,用treeview控件,怎么做?或者用其他控件可以做的,该怎么做?

解决方案 »

  1.   

    父层:department
    子层:worker用treeview
    ////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////
    //////////数据库结构:                            //////////
    //////////department: name:部门名称,char         //////////
    //////////            d_no:部门号,int            //////////
    //////////worker:     name:员工姓名,char         //////////
    //////////            w_no:员工号,int            //////////
    //////////            d_no:部门号,int            //////////
    ////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        ADOQuery1: TADOQuery;    //连接department
        ADOQuery2: TADOQuery;    //连接worker
        Edit1: TEdit;            //结点信息
        procedure Button1Click(Sender: TObject);//生成树
        procedure TreeView1Click(Sender: TObject);//显示结点信息
        procedure FormClose(Sender: TObject; var Action: TCloseAction);//释放p_data
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      p_data:pstring;
    implementation{$R *.DFM}//生成树
    procedure TForm1.Button1Click(Sender: TObject);
    var
       fn,sn:ttreenode;    //fn:部门结点 sn:员工结点
    begin
      treeview1.Items.BeginUpdate;
      adoquery1.close;
      adoquery1.sql.clear;
      adoquery1.sql.add('select * from department');
      adoquery1.open;
      treeview1.Items.Clear;
      new(p_data);
      p_data^:='root';
      fn:=treeview1.Items.AddObject(nil,'root',p_data);
      while not adoquery1.Eof do
      begin
        with treeview1.Items do
        begin
          new(p_data);
          p_data^:=adoquery1.fieldbyname('d_no').asstring;
          sn:=treeview1.Items.AddChildobject(fn,adoquery1.fieldbyname('name').asstring,p_data);      adoquery2.close;
          adoquery2.sql.Clear;
          adoquery2.sql.add('select * from worker where d_no=:d_no');
          adoquery2.Parameters.ParamByName('d_no').value:=p_data^;
          adoquery2.open;
          while not adoquery2.Eof do
          begin
            new(p_data);
            p_data^:=adoquery2.fieldbyname('w_no').asstring;
            treeview1.Items.addchildobject(sn,adoquery2.fieldbyname('name').asstring,p_data);
            adoquery2.Next;
          end;
        end;
        adoquery1.Next;
      end;
      adoquery1.Close;
      adoquery2.close;
      treeview1.Items.EndUpdate;
    end;//显示结点信息
    procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      if treeview1.Selected=nil then exit;  case treeview1.Selected.Level of
      1:begin
           edit1.text:='部门号:'+pstring(treeview1.selected.Data)^;
        end;
      2:begin
           edit1.text:='工号:'+pstring(treeview1.selected.Data)^;
        end;
      end;
    end;
    //释放p_data
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if p_data<> nil then Dispose(p_data);
    end;end.
      

  2.   

    function TfrmRight.GetCodeFromNode(sNodeText: String): String;
    var
      i : integer;
    begin
      i := Pos(')',sNodeText);
      Result := Copy(sNodeText,2,i-2);
    end;{******************************************
     * Name        :ReadUserGroupToTree       *
     * Function    :从用户组表中读取数据到树  *
     * input       :tv 存放用户组的树         *
     * OutPut      :无                        *
     * Return      :无                        *
     ******************************************}
    procedure TfrmRight.ReadUserGroupToTree(tv: TTreeView);
    var
      RootNode : TTreeNode;
      tempNode : TTreeNode;
      sTempText : String;
      Q_UserGroup : TADOQuery;
    begin
      tv.Items.Clear;
      RootNode := tv.Items.Add(nil,'用户信息');
      RootNode.ImageIndex := -1;
      RootNode.SelectedIndex := -1;
      Q_UserGroup := TADOQuery.Create(nil);
      try with Q_UserGroup,tv do
        begin
          { DONE 1 -oJonHua : Load Data from T_UserGroup 用用户组表中读取用户组信息}
          Connection := FrmDM.AdoConnt;
          SQL.Add('select * from T_UserGroup');
          Prepared;
          Open;
          First;
          Items.BeginUpdate;
          while not Eof do
          begin
            sTempText := '('+FieldByName('F_UserGroupCode').AsString+')'+FieldByName('F_UserGroupName').AsString;
            tempNode := items.AddChild(RootNode,sTempText);
            tempNode.ImageIndex := 0;
            tempNode.SelectedIndex := 0;
            Next;
          end;//end while
          Items.EndUpdate;
          RootNode.Expand(false);
        end;
      finally
        Q_UserGroup.Free;
      end;
    end;{******************************************
     * Name        :ReadUserToTree            *
     * Function    :从用户表中读取数据到树    *
     * input       :tv 存放用户组的树         *
     * OutPut      :无                        *
     * Return      :无                        *
     ******************************************}
    procedure TfrmRight.ReadUserToTree(tv: TTreeView);
    var
      Q_User : TADOQuery;
      UserGroupNode,RootNode,tempNode : TTreeNode;
      sUserText : String;
      sNodeCode,sCode : String;
    begin
      RootNode := tv.Items.GetFirstNode;//获得根节点;
      UserGroupNode := RootNode.getFirstChild;//获得第一个用户组节点;
      { DONE 2 -oJonHua : Load Data from T_User 从用户表中读取用户信息}
      Q_User := TADOQuery.Create(nil);
      try with Q_User,tv do
        begin
          Connection := FrmDM.AdoConnt;
          SQL.Add('select * from T_User');
          Open;
          Items.BeginUpdate;
          while UserGroupNode <> nil do
          begin
            First;
            while not Eof do
            begin
              sNodeCode := GetCodeFromNode(UserGroupNode.Text);
              sCode := FieldByName('F_UserGroup').AsString;//用户表中的用户组代码
              if sNodeCode = sCode then
              begin
                sUserText := '('+FieldByName('F_UserCode').AsString+')'+FieldByName('F_UserName').AsString;
                tempNode := Items.AddChild(UserGroupNode,sUserText);//增加属于该组的用户
                tempNode.ImageIndex := 1;
                tempNode.SelectedIndex := 1;
              end;//end if
              Next;
            end;//end while not Eof do
            UserGroupNode := UserGroupNode.getNextSibling;//获得下一个用户组节点
          end;//end while UserGroupNode <> nil do
          Items.EndUpdate;
        end;
      finally
        Q_User.Free;
      end;
    end;自己去体会吧,不懂的可以给我发mail:[email protected]