我创树的思想是把一级节点先查询出来,然后就用一个过程一个一个的往下面找子节点
我的数据结构是table name: PlatformUserTreeNodeId TreeNode ParentNode NodeName
-------------------------------------
1 0 NULL 用户树
2 001 0 生产技术部
3 002 0 送电处
4 003 0 变电处
5 004 0 信息中心
6 005 0 调度所
7 006 0 人事劳动部
8 006001 006 社保办
9 006001001 006001 医保
10 002001 002 大柳塔保线站
11 002002 002 神东保线站
代码如下:
...procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
var
node: TTreeNode;
begin with ADOQuery2 do begin
Close;
SQL.Clear;
SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
Open;
while not eof do begin
node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
AddNode(FieldByName('TreeNode').AsString,node);
next;
end;
end;end;
procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,ChildNode: TTreeNode;
Nodes: String;
begin
TreeView1.Items.Clear;
RootNode := TreeView1.Items.Add(nil,'组织机构树') ;
RootNode.SelectedIndex := 0;
with ADOQuery1 do begin
SQL.Clear;
SQL.Add('select * from PlatformUserTree where ParentNode = ''0'' order by TreeNode');
Open;
while not eof do
begin
ChildNode := TreeView1.Items.AddChild(RootNode,FieldByName('NodeName').AsString);
Nodes := FieldByName('TreeNode').AsString;
AddNode(Nodes, ChildNode);
next;
end;
end;
TreeView1.TopItem.Expanded := True;
end;如果一个节点下面有多个子节点,那么只能出现第一条记录的节点,例如:002下面有两个节点,只能出现002001 002 大柳塔保线站这个节点,另外一个节点选择不出来,因为ADOQuery2 的SQL语句又被重新更新了,请问大虾们怎么解决这个问题,谢谢
我的数据结构是table name: PlatformUserTreeNodeId TreeNode ParentNode NodeName
-------------------------------------
1 0 NULL 用户树
2 001 0 生产技术部
3 002 0 送电处
4 003 0 变电处
5 004 0 信息中心
6 005 0 调度所
7 006 0 人事劳动部
8 006001 006 社保办
9 006001001 006001 医保
10 002001 002 大柳塔保线站
11 002002 002 神东保线站
代码如下:
...procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
var
node: TTreeNode;
begin with ADOQuery2 do begin
Close;
SQL.Clear;
SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
Open;
while not eof do begin
node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
AddNode(FieldByName('TreeNode').AsString,node);
next;
end;
end;end;
procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,ChildNode: TTreeNode;
Nodes: String;
begin
TreeView1.Items.Clear;
RootNode := TreeView1.Items.Add(nil,'组织机构树') ;
RootNode.SelectedIndex := 0;
with ADOQuery1 do begin
SQL.Clear;
SQL.Add('select * from PlatformUserTree where ParentNode = ''0'' order by TreeNode');
Open;
while not eof do
begin
ChildNode := TreeView1.Items.AddChild(RootNode,FieldByName('NodeName').AsString);
Nodes := FieldByName('TreeNode').AsString;
AddNode(Nodes, ChildNode);
next;
end;
end;
TreeView1.TopItem.Expanded := True;
end;如果一个节点下面有多个子节点,那么只能出现第一条记录的节点,例如:002下面有两个节点,只能出现002001 002 大柳塔保线站这个节点,另外一个节点选择不出来,因为ADOQuery2 的SQL语句又被重新更新了,请问大虾们怎么解决这个问题,谢谢
定义一个变量,进去的时候创建好了
procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
var
node: TTreeNode;
adqTemp: TADOQuery;
begin
adqTemp := TADOQuery.Create(Self);
try
with adqTemp do begin
Close;
SQL.Clear;
SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
Open;
while not eof do begin
node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
AddNode(FieldByName('TreeNode').AsString,node);
next;
end;
end;
finally
adqTemp.Free;
end;
end;
你目前的程序中ADOQuery2是个全局变量,而在你的递归函数AddNode中却要求ADOQuery2应该是个局部变量。
procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
var
node : TTreeNode;
ADOQuery : TADOQuery;
begin
ADOQuery := TADOQuery.Create(Self);
with ADOQuery do
begin
Close;
SQL.Clear;
SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
Open;
while not eof do
begin
node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
AddNode(FieldByName('TreeNode').AsString,node);
next;
end;
end;
ADOQuery.Free;
end;
谢谢大侠指导。。