2张表:
客户表(Tbl_Client):
client_id(自增) client_name type_id
1 小江 3
2 小李 4客户类型表(Tbl_Client_Type):
type_id(自增) type_name parent_id(父类型)
1 国内 -1
2 国外 -1
3 北京 1
4 上海 1现在在DELPHI里放一个树形控件(treeview1) 要求把客户类型表里的数据加到treeview1中 象下面:
-- 客户资料
--国内
--北京
--上海
--国外
要求:写一个递归调用函数 把客户类型表里的数据加到treeview1中(提示:考虑数据结构中的2叉树和森林树的算法)
不用递归还能勉强做出来 C没学好 望好心人写下参考答案 THX
客户表(Tbl_Client):
client_id(自增) client_name type_id
1 小江 3
2 小李 4客户类型表(Tbl_Client_Type):
type_id(自增) type_name parent_id(父类型)
1 国内 -1
2 国外 -1
3 北京 1
4 上海 1现在在DELPHI里放一个树形控件(treeview1) 要求把客户类型表里的数据加到treeview1中 象下面:
-- 客户资料
--国内
--北京
--上海
--国外
要求:写一个递归调用函数 把客户类型表里的数据加到treeview1中(提示:考虑数据结构中的2叉树和森林树的算法)
不用递归还能勉强做出来 C没学好 望好心人写下参考答案 THX
with ClassADO do begin
Close;
SQL.Clear;
SQL.Add('select * from Class_Table where ParentID=0 order by cl_rank');
Open;
if not Eof then begin
while (not Eof) do begin
new(MyNode);
MyNode^.nodeParent:=FieldByName('ParentID').asInteger;
MyNode^.nodename:=FieldByName('Cl_Title').asstring;
LoadData(MyNode);
Next;
end;
end else begin
new(MyNode);
MyNode^.nodeParent:=0;
MyNode^.nodename:='请输入第一个频道名';
Node:=ClassTree.Items.AddChildObject(nil,'请输入第一个频道名',MyNode);
Node.ImageIndex:=1;
Node.SelectedIndex:=1;
end;
end;procedure TEditSubClassFrm.ReadNode(ownNode: TTreeNode; NodeId: integer);
//OwnNode:Pater node NodeId:self nodeid;
var
curNode: TtreeNode;
adoquery: TAdoQuery;
mynode: pmyid;
begin
adoquery := Tadoquery.create(parent);
adoquery.Connection := DMFrm.ADOConnection1;
adoquery.sql.text := 'select * from Class_Table where Parentid=' + intToStr(NodeID)+' order by cl_rank';
with adoquery do
begin
open;
first;
while not eof do
begin
new(mynode);
MyNode^.nodeParent:=FieldByName('ParentID').asInteger;
MyNode^.nodename:=FieldByName('Cl_Title').asstring;
curNode := ClassTree.Items.AddChildObject(ownNode, mynode.nodename, mynode);
curNode.SelectedIndex:=2-mynode.nodeshow;
curNode.ImageIndex:=2-mynode.nodeshow;
ReadNode(curNode,mynode.nodeid);
next;
end;
close;
free;
end;
// dispose(mynode);
end;
procedure TEditSubClassFrm.LoadData(MyID:pMyid);
var
CurNode:TTreeNode;
begin
CurNode:=ClassTree.Items.AddChildObject(nil,Myid.nodename,MyID); //載入要目錄
ReadNode(CurNode,MyId.NodeID);
end;
procedure TfrmClientType.Show(...)
begin
adosel.close;
adosel.sql.clear;
adosel.sql.add('select * from Tbl_Client_Type');
adosel.open;
....
....然后这里做处理
end;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'select type_id,type_name,parent_id from Tbl_Client_Type order by parent_id';
ADOQuery1.Open;
InitTreeView;
end;procedure TForm1.InitTreeView;
procedure AddChildrenNode(pnode: TTreeNode);
var
i: Integer;
_node: TTreeNode;
begin
//Set the Filter Condition
ADOQuery1.Filtered := false;
ADOQuery1.Filter := 'parent_id=' + IntToStr(pnode.OverlayIndex);
ADOQuery1.Filtered := true; ADOQuery1.First; //Restore the rs-index
//Add the Record to the ParentNode
for i := 0 to ADOQuery1.RecordCount - 1 do
begin
_node := TreeView1.Items.AddChild(pnode, ADOQuery1.FieldByName('type_name').AsString);
_node.OverlayIndex := ADOQuery1.FieldByName('type_id').AsInteger;
ADOQuery1.Next;
end;
//recursion
for i := 0 to pnode.Count - 1 do
AddChildrenNode(pnode.Item[i]);
end;
var
_topNode: TTreeNode;
begin
TreeView1.Items.BeginUpdate;
//---add the top parent node
_topNode := TreeView1.Items.AddChild(nil,'TopNodeAddByXinhs');
_topNode.OverlayIndex := -1; //The casual ward for ParentID
//end add
AddChildrenNode(_topNode);
TreeView1.Items.EndUpdate;
_topNode.Selected := True;
end;