很多系統(tǒng)都有類似于如下的表結(jié)構(gòu)(table1):
ID Name ParentID
---------------------------------------------------------
001 電子類 0
002 金屬類 0
003 電容電子 001
004 電阻電子 001
005 有色金屬 002
而且大家都習(xí)慣于用樹(TreeView)來顯示,這樣就可以很好的顯示整個(gè)表的分類情況。但如果數(shù)據(jù)量多時(shí)會(huì)造成樹的生成比較慢,特別是用遞歸來實(shí)現(xiàn)時(shí)要訪問數(shù)據(jù)庫的次數(shù)很多(根據(jù)層數(shù)),用在三層中效果更加顯。在此提供一個(gè)好的方法來生成樹形結(jié)構(gòu)。
這個(gè)算法只訪問一次數(shù)據(jù)庫,具體的實(shí)現(xiàn)如下:
1、一次性從數(shù)據(jù)庫中取出所有的數(shù)據(jù),并按照ParentID字段進(jìn)行排序,這樣就保證每一條數(shù)據(jù)的父節(jié)點(diǎn)都在它的前面。
2、取出第一條數(shù)據(jù)畫到樹中,在添加到樹中時(shí)先找到這條數(shù)據(jù)的父節(jié)點(diǎn),如果沒有 則將此記錄直接作為樹的第一級(jí)節(jié)點(diǎn)
3、如果還有數(shù)據(jù),則取出來執(zhí)行第2步,直到?jīng)]有數(shù)據(jù)為止。
程序?qū)崿F(xiàn):
本程序?qū)⒂靡粋€(gè)stlID的TStringList變量來存放對(duì)應(yīng)樹中每一個(gè)節(jié)點(diǎn)的ID值,用FindParent函數(shù)來父節(jié)點(diǎn)。
function FindParent(ID:String):TTreeNode;
var
i:Integer;
begin
result:=nil;
for i:=TreeView1.Items.Count-1 downto 0 do
if stlID.Strings[i]=ID then
begin
result:=TreeView1.Items[i];
break;
end;
end;
//生成樹
PRocedure CreateTree;
var
tmpNode:TTreeNode;
begin
Query1.close;
Query1.SQL.Text:='select * from table1 order by ParentID';
Query1.Open;
Query1.First;
while not Query1.Eof do
begin
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//記錄ID
Query1.Next;
end;
end;
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注