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;
//調用這個就行了
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 InitTV(TV:TTreeView);
var
TN1:TTreeNode;
R:TStringList;
function GetTN(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-1 do
if T.Items.Item[I].Text=S1 then Result:=T.Items.Item[i];
Finally
Result:=nil;
end;
end;
begin
R:=TStringList.Create;
Try
with DM do
begin
TSetSelect('Select 部门编号,部门名称,上级部门 From P_bmzl');
with TSet do
while not Eof do
begin
R.Add(Trim(FieldValues['部门编号'])+'='+Trim(FieldValues['部门名称']));
if (FieldByName('上级部门').IsNull or (Trim(FieldValues['上级部门'])='')) then
TN1:=TV.Items.AddChild(Nil,Trim(FieldValues['部门名称']))
else
TN1:=TV.Items.AddChild(GetTN(TV,Trim(FieldValues['上级部门']),R),Trim(FieldValues['部门名称']));
TN1.ImageIndex:=0;
Next;
end;
showinfo(R.Text);
end;{end of with DM}
Finally
R.Free;
end;{end of Try}
你可以在开始的时候只调最上层的部门
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时再把所需要的第二三层数据填进去
其实这是一个反复查询的过程,你首先把上级部门给空的放到treeview的第一个目录下,也就是你说的直接添加到根下,然后再查询上级部门不给空的数据,找到他在treeview中所在的位置,再直接添加就可以了,你可以分析如下代码:
假设上级部门没有时,为0
var thisnode,tnode:TTreeNode;
str:string;
begin
thisnode:=treeview1.Items.GetFirstNode;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * form p_bm');
query1.Open;
while not Query1.Eof do
begin
if query1.FieldByName('上级部门').AsString='0' then
treeview1.Items.Add(thisnode,query1.fieldbyname('部门名称').AsString)
else
tnode:=treeview1.Items.GetFirstNode;
while tnode<>nil do
begin
if tnode.Text=query1.FieldByName('上级部门').AsString then
begin
treeview1.Items.AddChild(tnode,Query1.fieldbyname('部门名称').AsString);
break;
end;
tnode.GetNext;
end;
end;
end;