很多系統都有類似如下的表格結構(table1):
IDName ParentID
-------------------------------------------------- -------
001 電子類0
002金屬類0
003 電容電子001
004 電阻電子001
005 有色金屬002
而且大家都習慣用樹(TreeView)來顯示,這樣就可以很好的顯示整個表的分類。但如果資料量多時會造成樹的生成比較慢,特別是用遞歸來實現時要存取資料庫的次數很多(根據層數),用在三層中效果更加顯。在此提供一個好的方法來產生樹狀結構。
這個演算法只存取一次資料庫,具體的實作如下:
1.一次從資料庫中取出所有的數據,並依照ParentID欄位進行排序,這樣就保證每一條資料的父節點都在它的前面。
2.取出第一條資料畫到樹中,在加入樹中時先找到這條資料的父節點,如果沒有則將此記錄直接作為樹的第一級節點
3.如果還有數據,則取出來執行第2步,直到沒有數據。
程式實現:
本程式將以一個stlID的TStringList變數來存放對應樹中每一個節點的ID值,並用FindParent函數來父節點。
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;