小弟研究網上抓來的db 的table 全部一次加載方法,如下的代碼測試OK但若想要加載指定某一結點以下的加有資料要怎麼做呢?
比如想要加載 ID=10的節點,以及它下層連結的所有節點。
procedure MakeTree(Query: TADOQuery; TableName: string; TreeView: TTreeView);
begin
  TreeView.Items.BeginUpdate;
  list.Clear;
  TreeView.items.clear;
  if query.Active then query.Close;
  Query.SQL.Text := 'SELECT * FROM ' + TableName + ' ORDER BY PID, ID';
  Query.Open;
  query.DisableControls;
  TreeView.Items.Clear;
  list.Clear;
  List.Sorted := True;
  query.First;
  while not Query.Eof do
  begin
      addtreenode(Query, TreeView);
      Query.Next;
  end;
  TreeView.Items.EndUpdate;
  query.EnableControls;
  if treeview.Items.Count < 1 then exit;
  treeview.Select(treeview.Items.Item[0]);
  treeview.SetFocus;
end;procedure addtreenode(Query: TADOQuery; TreeView: TTreeView; bj: boolean = false);
var
  index: integer;
  Node: TTreeNode;
begin
  if Query.FieldByName('PID').AsInteger = 0 then 
    Node := TreeView.Items.AddChildObject(nil, Query.FieldByName('CAPTION').AsString, query.GetBook)  else
  begin
     Index := List.IndexOf(Query.FieldByName('PID').AsString);
     Node := TreeView.Items.AddChildObjectFirst(TTreeNode(List.Objects[Index]),
          Query.FieldByName('CAPTION').AsString, query.GetBook);
     Node.StateIndex :=Node.Level +1;
  end;  List.AddObject(Query.FieldByName('ID').AsString, Node);
  if bj then
  begin
    treeview.Select(node);
    treeview.SetFocus;
  end;
end;

解决方案 »

  1.   

    procedure addtreenode(Query: TADOQuery; TreeView: TTreeView; bj: boolean = false);
    改成 procedure addtreenode(Query: TADOQuery; TreeNode: TTreeNode; bj: boolean = false);然后在TreeNode下加数据,和你上边的操作差不多 
      

  2.   

    开始没看到addtreenode递归调用自己,以为不对
    原来是利用list来定位已经加入的父节点想要 仅仅 加載 ID=10的節點,以及它下層連結的所有節點
    这个机制好像没有好的约束办法,只能全部加载完了再删除不需要的节点