库中有两个表,一个是部门列表,一个员工列表
P_BM表的结构为
序号,部门编号,部门名称,上级部门,部门说明
P_YG表的结构为
序号,员工编号,员工姓名,所属部门,等等。
现在在要把这两个表的内容添加到一个TreeView中,要求是:
一个部门要添加到它的上级部门下,没有上级部门的可以直接添加到根下,员工添加到所属部门下。
要考虑的情况是一个部门有多个多级子部门,其次是数据量很大。
只要部门的Treeview树解决了,我想你把员工加到部门树应该不是问题了吗?
Query1.SQL.Add(select * form p_bm);这一句改成:
Query1.SQL.Add(select * form p_bm order by 上级部门);也许要好一些
你可以在开始的时候只调最上层的部门
select 部门名称 from p_bm where 上级部门=
adoquery.sql.add(select 部门名称 from p_bm where 上级部门=);
adoquery.open;
while not adoquery.eof do
begin
node:=treeview1.items.add(treeview1.selected,adoquery.fieldbyname(部门名称))//增加节点
str:=select 部门名称 p_bm hwere 上级部门=+adoquery.fieldbyname(部门名称);
adoquery1.sql.add(str);
sdoquery1.open;
if not adoqeury1.eof then
treeview1.items.addchild(node,temp);
end;
当展开treeview1时再把所需要的第二三层数据填进去
总的意思就是先只读一层数据,然后用户点到哪个节点再动态生成这个节点的一层子节点,以此类推吧
//調用這個就行了
function TForm1.GetTNByView(T: TTreeView; S: String; L: TStringList): TTreeNode;
var
I:Integer;
S1:String;
begin
S1:=L.Names[L.IndexOf(S)];
Try
for i := 0 to T.Items.Count do
begin
Result := GetTNByNode(T.Items[i],s);//這個調用下面的東西
if Result <> nil then Exit;
end;
except
Result:=nil;
end;
end;
function TForm1.GetTNByNode(T:TTreeNode;S:String):TTreeNode;
var
I:Integer;
begin
Try
for i:= 0 to T.Count - 1 do
begin
if T.Item[I].Text=S then
Result:=T.Item[i]
else if T.Item[I].Count > 0 then
Result := GetTNByNode(T.Item[I],S);
if Result <> nil then Exit;
end;
except
Result:=nil;
end;
end;
你試試看
procedure Tcpya_app.FormCreate(Sender: TObject);
begin
datamodule2.tree.close;
datamodule2.tree.sql.clear;
datamodule2.tree.sql.add(select name from plat order by name);
datamodule2.tree.Active:=true;
datamodule2.tree.Open;
while not datamodule2.tree.Eof do
begin
with tv.Items do
begin
MyTreeNode1 := Add(nil,trim(datamodule2.tree.fields[0].asstring));
with datamodule2 do
begin
child.close;
child.SQL.Clear;
child.SQL.Add(select comp from dalei where plat=+Trim(datamodule2.tree.Fields[0].asstring)++ order by comp);
child.Active:=true;
child.Open;
While Not child.Eof do
begin
TV.Items.AddChild(mytreenode1,trim(child.Fields[0].AsString));
child.Next;
end; end;
datamodule2.tree.Next;
end;
end;
end;
使我再做项目的时候写的 其中tree、child TADOQUERY
我有一个控件,是TREE的,但您表的格式不同,您如果用一个SQL把两个表进行联接,就好办了,因为我的控件只要有Tree编码与对应名称就行了。
如:
P_BM表的结构为
序号,部门编号,部门名称,上级部门,部门说明
P_YG表的结构为
序号,员工编号,员工姓名,所属部门,等等。
中,用P_YG表中的所属部门与P_BM表中的部门编号或部门名称为关联,建立视图,结构如:
序号,部门编号,部门名称,上级部门,部门说明,序号,员工编号,员工姓名,所属部门,等等,您就可以用我那控件了。
http://www.myjinsui.com/down/soft/gbxx.exe