根據數據庫結構生成TreeView

如今大多數的方法是採用遞歸,但這種操做會頻繁的去select數據庫,下降了執行效率,稍微改動一些,效果會好很多,這裏介紹一種方法,即一次性select出全部數據,而後按照ParentID排序,逐條添加到TreeView,添加前,先遍歷TreeView,查找他的上一級節點,遍歷Treeview可比select數據快啊,下面看代碼:node

 

數據表結構,最頂級parentid值我用的是-1,你們也能夠用其餘值,但要保證最頂級parentid值最小,層次越深,parentid越大數據庫

 

procedure TUIOperate.FillTree(treeview: TTreeView);
var
findq: TADOQuery;
node: TTreeNode;blog

//這個方法是根據記錄的id字段值,查找TreeView上的父節點
function FindParentNode(id:Integer):TTreeNode;
var
i:Integer;
begin
Result := nil;
for i := 0 to treeview.Items.Count - 1 do
begin
//比較Node的Data值和記錄的id值
if Integer(treeview.Items[i].Data) = id then
begin
Result := treeview.Items[i];
Break;
end;
end;
end;排序

begin
findq := TADOQuery.Create(nil);
findq.Connection := controler.DataConnect.Connection; //這裏的Connection指向你的數據鏈接
try
treeview.Items.BeginUpdate;
treeview.Items.Clear;
//選出全部記錄,並按parentid排序,這樣能夠保證先添加頂級節點,在下級記錄添加時,總能找到父節點
findq.SQL.Text := 'SELECT * FROM [Catalog] order by parentid,id';
findq.Open;
while not findq.Eof do
begin
//若是是最頂級,直接添加到Treeview
if findq.FieldByName('parentid').AsInteger = -1 then
//將id值,保存在Node的Data中,以便查找用
treeview.Items.AddObject(nil,findq.FieldByName('CatalogName').AsString,Pointer(findq.FieldByName('id').AsInteger))
else
begin
//查找上級節點
node := FindParentNode(findq.FieldByName('parentid').AsInteger);
if node <> nil then
treeview.Items.AddChildObject(node,findq.FieldByName('CatalogName').AsString,Pointer(findq.FieldByName('id').AsInteger));
end;
findq.Next;
end;
finally
findq.Free;
treeview.Items.EndUpdate;
end;
end;遞歸

相關文章
相關標籤/搜索