數據庫表TreeView樹的快速生成
根據數據表的內容生成TreeView樹狀結構,通常的做法就是從頂級開始,然后逐項遞歸查詢遍歷生成。這種方法在實現上容易做到,也很容易想到,但是效率比較低,因為數據庫的檢索(SQL語句需要解釋執(zhí)行,而且是對數據庫文件進行操作)還是比較耗時的,尤其是樹的層次較多,節(jié)點較多的情況。這里我要介紹的方法是以空間換取時間,只進行一次數據庫檢索,提取出全部數據,然后一次生成TreeView樹狀結構。通過SQL語句,讓返回的記錄按照父節(jié)點ID、節(jié)點ID進行排序,這樣保證每次當前要添加的節(jié)點記錄的父節(jié)點都已經添加到了TreeView樹中,剩下的工作就是如何在TreeView樹中找到父節(jié)點。這里我采用了一個排序的TStringList列表,通過排序列表采用二分查找的快速性能,就能夠很快地查找到當前要添加節(jié)點的父節(jié)點,從而插入到TreeView樹的正確位置。 源代碼如下(假定數據表名稱為FTree,字段有ID, ParentID, Name): procedure MakeTree(Query: TQuery; TreeView: TTreeView); var List: TStringList; Node: TTreeNode; Index: Integer; begin TreeView.Items.BeginUpdate; try TreeView.Items.Clear; List := TStringList.Create; try List.Sorted := True; while not Query.Eof do begin if Query.FieldByName('ParentID').AsInteger = 0 then { ParentID=0,頂層節(jié)點 } Node := TreeView.Items.AddChild(nil, Query.FieldByName('Name').AsString) else begin Index := List.IndexOf(Query.FieldByName('ParentID').AsString); Node := TreeView.Items.AddChild(TTreeNode(List.Objects[Index]), Query.FieldByName('Name').AsString); end; List.AddObject(Query.FieldByName('ID').AsString, Node); Query.Next; end; finally List.Free; end; finally TreeView.Items.EndUpdate; end; end; procedure TForm1.Button1Click(Sender: TObject); var T: DWORD; begin T := GetTickCount; Query1.SQL.Text := 'SELECT * FROM FTree ORDER BY ParentID, ID'; Query1.Open; MakeTree(Query1, TreeView1); Label1.Caption := Format('MakeTree所用時間: %d ms', [GetTickCount - T]); end; |
|
來自: 悟靜 > 《.net和asp.net》