2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

數據庫表TreeView樹的快速生成

 悟靜 2011-02-14
數據庫表TreeView樹的快速生成

根據數據表的內容生成TreeView樹狀結構,通常的做法就是從頂級開始,然后逐項遞歸查詢遍歷生成。這種方法在實現上容易做到,也很容易想到,但是效率比較低,因為數據庫的檢索(SQL語句需要解釋執(zhí)行,而且是對數據庫文件進行操作)還是比較耗時的,尤其是樹的層次較多,節(jié)點較多的情況。這里我要介紹的方法是以空間換取時間,只進行一次數據庫檢索,提取出全部數據,然后一次生成TreeView樹狀結構。通過SQL語句,讓返回的記錄按照父節(jié)點ID、節(jié)點ID進行排序,這樣保證每次當前要添加的節(jié)點記錄的父節(jié)點都已經添加到了TreeView樹中,剩下的工作就是如何在TreeView樹中找到父節(jié)點。這里我采用了一個排序的TStringList列表,通過排序列表采用二分查找的快速性能,就能夠很快地查找到當前要添加節(jié)點的父節(jié)點,從而插入到TreeView樹的正確位置。

源代碼如下(假定數據表名稱為FTree,字段有ID, ParentID, Name):
procedure MakeTree(Query: TQuery; TreeView: TTreeView);
var
  List: TStringList;
  Node: TTreeNode;
  Index: Integer;
begin
  TreeView.Items.BeginUpdate;
  try
    TreeView.Items.Clear;

    List := TStringList.Create;
    try
      List.Sorted := True;

      while not Query.Eof do
      begin
        if Query.FieldByName('ParentID').AsInteger = 0 then { ParentID=0,頂層節(jié)點 }
          Node := TreeView.Items.AddChild(nil, Query.FieldByName('Name').AsString)
        else
        begin
          Index := List.IndexOf(Query.FieldByName('ParentID').AsString);
          Node := TreeView.Items.AddChild(TTreeNode(List.Objects[Index]),
            Query.FieldByName('Name').AsString);
        end;
        List.AddObject(Query.FieldByName('ID').AsString, Node);
        Query.Next;
      end;
    finally
      List.Free;
    end;
  finally
    TreeView.Items.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  T: DWORD;
begin
  T := GetTickCount;
  Query1.SQL.Text := 'SELECT * FROM FTree ORDER BY ParentID, ID';
  Query1.Open;
  MakeTree(Query1, TreeView1);
  Label1.Caption := Format('MakeTree所用時間: %d ms', [GetTickCount - T]);  
end; 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多