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