Delphi中根據分類資料生成樹形結構的最優方法 (轉)

amyz發表於2007-08-15
Delphi中根據分類資料生成樹形結構的最優方法 (轉)[@more@]

很多都有類似於如下的表結構(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..Text:=' * from table1 order by ParentID';

  Query1.Open;

  Query1.First;

  while not Query1.Eof do

  begin

  tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FielyName('ParentID').AsString),Query1.FieldByName('Name').AsString);

  stlID.Add(Query1.FieldByName('ID').AsString);//記錄ID

  Query1.Next;

  end;

end;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958564/,如需轉載,請註明出處,否則將追究法律責任。

相關文章