資料庫表TreeView樹的快速生成

2021-09-08 08:20:57 字數 2040 閱讀 2844

根據資料表的內容生成treeview樹狀結構,通常的做法就是從頂級開始,然後逐項遞迴查詢遍歷生成。這種方法在實現上容易做到,也很容易想到,但是效 率比較低,因為資料庫的檢索(sql語句需要解釋執行,而且是對資料庫檔案進行操作)還是比較耗時的,尤其是樹的層次較多,節點較多的情況。這裡我要介紹 的方法是以空間換取時間,只進行一次資料庫檢索,提取出全部資料,然後一次生成treeview樹狀結構。通過sql語句,讓返回的記錄按照父節點id、 節點id進行排序,這樣保證每次當前要新增的節點記錄的父節點都已經新增到了treeview樹中,剩下的工作就是如何在treeview樹中找到父節 點。這裡我採用了乙個排序的tstringlist列表,通過排序列表採用二分查詢的快速效能,就能夠很快地查詢到當前要新增節點的父節點,從而插入到treeview樹的正確位置。

源**如下(假定資料表名稱為ftree,欄位有id, parentid, name):

1

procedure maketree(query: tquery; treeview: ttreeview);

2var

3 list: tstringlist;

4 node: ttreenode;

5 index: integer;

6begin

7 treeview.items.beginupdate;

8try

9 treeview.items.clear;

1011 list := tstringlist.create;

12try

13 list.sorted := true;

1415

while

not query.eof do

16begin

17if query.fieldbyname('

parentid

').asinteger = 0

then

18 node := treeview.items.addchild(nil, query.fieldbyname('

name

').asstring)

19else

20begin

21 index := list.indexof(query.fieldbyname('

parentid

').asstring);

22 node := treeview.items.addchild(ttreenode(list.objects[index]),

23 query.fieldbyname('

name

').asstring);

24end;

25 list.addobject(query.fieldbyname('

id').asstring, node);

26 query.next;

27end;

28finally

29 list.free;

30end;

31finally

32 treeview.items.endupdate;

33end;

34end;

3536

procedure tform1.button1click(sender: tobject);

37var

38 t: dword;

39begin

40 t := gettickcount;

41 query1.sql.text := '

select * from ftree order by parentid, id

';42 query1.open;

43 maketree(query1, treeview1);

44 label1.caption := format('

', [gettickcount - t]);

45end;

TREEVIEW資料庫繫結

treeview資料庫繫結 2007年07月10日 星期二 09 58 資料庫create database treeview gouse treeview create table node1 nd1id int primary key,nd1name varchar 32 create tabl...

treeview 顯示ACCESS資料庫中的字段

option explicit private sub form load 工程 引用 選中microsoft activex data objects 2.8 library dim shujukulianjie as new adodb.connection dim jiluji as new ...

資料庫繫結TreeView,無限層級

初始化樹 private void inittreeview this.roletree.nodes.add node getchildnode roleauthoritylist,authorityinfolist,node 遞迴方法獲取子型別 private void getchildnode ...