1. 程式人生 > >根據數據庫結構生成RzCheckTree

根據數據庫結構生成RzCheckTree

其他 pre tex proc tac check res roc final

現在大多數的方法是采用遞歸,但這種操作會頻繁的去select數據庫,降低了執行效率,稍微改動一些,效果會好不少,這裏介紹一種方法,即一次性select出所有數據,然後按照ParentID排序,逐條添加到TreeView,添加前,先遍歷TreeView,查找他的上一級節點,遍歷Treeview可比select數據快啊,下面看代碼:
 
數據表結構,最頂級parentid值我用的是-1,大家也可以用其他值,但要保證最頂級parentid值最小,層次越深,

  技術分享

procedure TUIOperate.FillTree(RzCheckTree: TRzCheckTree);
var
  findq: TADOQuery;
  node: TTreeNode;

  
//這個方法是根據記錄的id字段值,查找RzCheckTree上的父節點 function FindParentNode(id:Integer):TTreeNode; var i:Integer; begin Result := nil; for i := 0 to RzCheckTree.Items.Count - 1 do begin //比較Node的Data值和記錄的id值 if Integer(RzCheckTree.Items[i].Data) = id then begin Result := RzCheckTree.Items[i]; Break;
end; end; end; begin findq := TADOQuery.Create(nil); findq.Connection := controler.DataConnect.Connection; //這裏的Connection指向你的數據連接 try RzCheckTree.Items.BeginUpdate; RzCheckTree.Items.Clear; //選出所有記錄,並按parentid排序,這樣可以保證先添加頂級節點,在下級記錄添加時,總能找到父節點 findq.SQL.Text := SELECT * FROM [Catalog] order by parentid,id
; findq.Open; while not findq.Eof do begin //如果是最頂級,直接添加到RzCheckTree if findq.FieldByName(parentid).AsInteger = -1 then //將id值,保存在Node的Data中,以便查找用 RzCheckTree.Items.AddObject(nil,findq.FieldByName(CatalogName).AsString,Pointer(findq.FieldByName(id).AsInteger)) else begin //查找上級節點 node := FindParentNode(findq.FieldByName(parentid).AsInteger); if node <> nil then RzCheckTree.Items.AddChildObject(node,findq.FieldByName(CatalogName).AsString,Pointer(findq.FieldByName(id).AsInteger)); end; findq.Next; end; finally findq.Free; RzCheckTree.Items.EndUpdate; end; end;

根據數據庫結構生成RzCheckTree