表
ID,name,upid
1,A,0
2,B,0
3,C,0
4,a1,1
5,a11,4结果
A
|____a1
| |_____a11
B
|
C要求:不要写N个内循环.加载速度快如何写?
最好写Delphi源码.
问题关键:
如何根据upid找到父节点问题不难,求高手教教我...感谢.
ID,name,upid
1,A,0
2,B,0
3,C,0
4,a1,1
5,a11,4结果
A
|____a1
| |_____a11
B
|
C要求:不要写N个内循环.加载速度快如何写?
最好写Delphi源码.
问题关键:
如何根据upid找到父节点问题不难,求高手教教我...感谢.
http://blog.csdn.net/blazingfire/archive/2008/05/21/2465965.aspx
procedure BuildTree(TreeView: TTreeView; DataSet: TDataSet;
KeyField, ParentField, TitleField: string);
{ 高效建树过程 by blazingfire 2008-05-21 }
type
PNodeData = ^TNodeData;
TNodeData = record
Key: Integer;
Parent: Integer;
Title: string;
Node: TTreeNode;
end; function CompareKey(Item1, Item2: Pointer): Integer;
begin
Result := PNodeData(Item1)^.Key - PNodeData(Item2)^.Key;
end; function BisearchNodeData(Key: Integer; SortedList: TList): PNodeData;
var
Lo, Hi, Mid: Integer;
begin
Lo := 0;
Hi := SortedList.Count - 1;
while Lo <= Hi do
begin
Mid := (Lo + Hi) div 2;
Result := SortedList[Mid];
if Key > Result^.Key then
Lo := Mid + 1
else if Key < Result^.Key then
Hi := Mid - 1
else
Exit {至此已经找到};
end;
Result := nil;
end; procedure BuildNode(nData: PNodeData; SortedList: TList);
var
ParentData: PNodeData;
begin
if nData^.Node = nil then
begin
//折半查找父级PNodeData
ParentData := BisearchNodeData(nData^.Parent, SortedList);
//父级为空或是本身,就建一个根节点
if (ParentData = nil) or (ParentData = nData) then
nData^.Node := TreeView.Items.AddChild(nil, nData^.Title)
else
begin
if ParentData.Node = nil then
BuildNode(ParentData, SortedList);
nData^.Node := TreeView.Items.AddChild(ParentData.Node, nData^.Title);
end;
end;
end;var
List, SortedList: TList;
i: Integer;
nData: PNodeData;
fldKey, fldParent, fldTitle: TField;
begin
TreeView.Items.BeginUpdate;
List := TList.Create;
try
fldKey := DataSet.FieldByName(KeyField);
fldParent := DataSet.FieldByName(ParentField);
fldTitle := DataSet.FieldByName(TitleField);
TreeView.Items.Clear; DataSet.DisableControls;
try
//把数据集的数据加载到内存,以备在内存里建树
DataSet.First;
while not DataSet.Eof do
begin
New(nData);
nData^.Key := fldKey.AsInteger;
nData^.Parent := fldParent.AsInteger;
nData^.Title := fldTitle.AsString;
nData^.Node := nil;
List.Add(nData);
DataSet.Next();
end;
finally
DataSet.EnableControls;
end; SortedList := TList.Create;
try
SortedList.Assign(List);
SortedList.Sort(@CompareKey); //以Key排序,以备用折半查找
for i := 0 to List.Count - 1 do
BuildNode(List[i], SortedList);
finally
SortedList.Free;
end;
finally
TreeView.Items.EndUpdate;
for i := 0 to List.Count - 1 do
Dispose(List[i]);
List.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
//对于你的问题测试代码
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'SELECT ID,name,upid from TableName';
ADOQuery1.Open;
BuildTree(TreeView1, ADOQuery1, 'ID', 'upid', 'name');
end;