小弟研究網上抓來的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;
改成 procedure addtreenode(Query: TADOQuery; TreeNode: TTreeNode; bj: boolean = false);然后在TreeNode下加数据,和你上边的操作差不多
原来是利用list来定位已经加入的父节点想要 仅仅 加載 ID=10的節點,以及它下層連結的所有節點
这个机制好像没有好的约束办法,只能全部加载完了再删除不需要的节点