很多系統都有類似于如下的表結構(table1):
ID Name 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;
新聞熱點
疑難解答
圖片精選