我有一个数据表 (MDTasks),其中包含以 TreeView 表示的记录。每条记录都有一个唯一的字段“ID”和一个字段“Parent_ID”,它指的是父记录的 ID。我正在尝试列出具有给定 ID 的任何记录级别的所有 child 的列表。我有以下内容,它获取每个级别的第一个 child ,但不会返回任何级别的 sibling 。我将不胜感激任何帮助。谢谢。
procedure TfmList.GetChildren(TaskID: integer);
var
iChildID: integer;
begin
with MDTasks do
begin
first;
while not EOF do
begin
if FieldByName('Parent_ID').AsInteger = TaskID then
begin
iChildID := FieldByName('ID').AsInteger;
Memo1.Lines.Add(IntToStr(iChildID));
GetChildren(iChildID);
end;
next;
end;
end;
end;
最佳答案
如果我理解正确的话,下面的代码应该可以满足您的要求。它使用 ClientDataSet,以便我的答案是独立的,以便可以轻松设置测试数据。
它使用对 CloneCursor
的调用来递归搜索指定父节点 ID 的子节点。
procedure TForm1.FormCreate(Sender: TObject);
begin
CDS1.CreateDataSet;
CDS1.InsertRecord([1, -1]);
CDS1.InsertRecord([2, -1]);
CDS1.InsertRecord([3, -1]);
CDS1.InsertRecord([4, 2]); // This and the following rows are all children of ID = 2
CDS1.InsertRecord([5, 2]);
CDS1.InsertRecord([6, 4]);
CDS1.InsertRecord([7, 4]);
CDS1.InsertRecord([8, 7]);
FindChildren(2);
end;
procedure TForm1.FindChildren(ParentID : Integer);
procedure FindChildrenInner(ParentID : Integer);
var
TempCDS : TClientDataSet;
ID : Integer;
begin
TempCDS := TClientDataSet.Create(Nil);
try
TempCDS.CloneCursor(CDS1, False, True);
TempCDS.First;
while not TempCDS.Eof do begin
if TempCDS.FieldByName('Parent_ID').AsInteger = ParentID then begin
ID := TempCDS.FieldByName('ID').AsInteger;
Memo1.Lines.Add(Format('ID: %d, Parent: %d', [ID, ParentID]));
FindChildrenInner(ID);
end;
TempCDS.Next;
end;
finally
TempCDS.Free;
end;
end;
begin
Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Clear;
Assert(CDS1.Locate('ID', ParentID, []));
FindChildrenInner(ParentID);
finally
Memo1.Lines.EndUpdate;
end;
end;
关于delphi - 在分层数据集中获取子记录的递归过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40458858/