一个树形结构的问题。 从数据库读取出数据,分两层,即父层子层。分别来自两个表。向做成树形结构,用treeview控件,怎么做?或者用其他控件可以做的,该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 父层: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_dataprocedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin if p_data<> nil then Dispose(p_data);end;end. 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] 如何解决delphi内存泄露的问题? 两个DBGrid显示同一数据源! delphi报表 查找数据表 怎么写这个sql查询语句,实现字段类型由字符类型转成整数型?谢谢 关于Delphi6.0 TTable找不到的问题 delphi打开网页怎么给网页中的文本框复制 请问“营业中”盘点的方法与工作流程! 有人知道QrDesignReport这套报表控件吗?高分答谢!!! 这句SQL查询语句怎么错了呢? 为什么这个DLL总是不能被VB调用? 怎么算一个Tdatetime的后一天? 在线等待
子层: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.
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]