VirtualTree 树型显示来自数据库表的数据 [悬赏1000分](300分)

  • 主题发起人 主题发起人 畅雨
  • 开始时间 开始时间

畅雨

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库表: ID,ParentID,title.利用ID,parentID构造树,用VirtualstringTree显示.用一个query来取数,不能用2个进行处理.解决问题1000分(好像一个问题最高300分,另开帖给其余的)
 
我封装了 dbVirtualstringTree
 
procedure ZsDataSetToTreeView(mDataSet: TDataSet;
mTreeView: TTreeView);
{ 将数据源转换成可视树 }
type
TArrayTreeNode = array of TTreeNode;
var
vFieldCount: Integer;
vStringList: TStringList;
procedure pZsDataToTreeNode(mArrayTreeNode: TArrayTreeNode;
mIndex: Integer;
mValueList: string);
var
vTreeNode, vTempTreeNode: TTreeNode;
vStr, S, vTemp: string;
I: Integer;
vArrayTreeNode: TArrayTreeNode;
begin
vTemp := mValueList;
vStringList.Text := mValueList;
vStr := #13#10;
vTreeNode := nil;
if mIndex < vStringList.Count then
begin
if (Pred(mIndex) >= Low(mArrayTreeNode)) and (Pred(mIndex) < High(mArrayTreeNode))then
vTreeNode := mArrayTreeNode[Pred(mIndex)];
vStr := vStringList[mIndex];
end;
vArrayTreeNode := mArrayTreeNode;
with mDataSetdo
while not Eofdo
begin
S := FieldByName(FieldDefs[mIndex].Name).AsString;
if (vStr = #13#10) or (vStr <> S) or (mIndex = Pred(vFieldCount)) then
begin
vTreeNode := mTreeView.Items.AddChild(vTreeNode,
FieldByName(FieldDefs[mIndex].Name).AsString);
vStr := S;
vTempTreeNode := vTreeNode;
SetLength(vArrayTreeNode, vFieldCount);
vArrayTreeNode[mIndex] := vTempTreeNode;
for I := Succ(mIndex) to Pred(vFieldCount)do
begin
vTempTreeNode := mTreeView.Items.AddChild(vTempTreeNode,
FieldByName(FieldDefs.Name).AsString);
vArrayTreeNode := vTempTreeNode;
end;
vStringList.Clear;
for I := 0 to Pred(vFieldCount)do
vStringList.Add(FieldByName(FieldDefs.Name).AsString);
vTemp := vStringList.Text;
Next;
pZsDataToTreeNode(vArrayTreeNode, 0, vTemp);
vArrayTreeNode := nil;
end else
begin
pZsDataToTreeNode(vArrayTreeNode, Succ(mIndex), vTemp);
end;
end;
end;

begin
vStringList := TStringList.Create;
mTreeView.Items.Clear;
vFieldCount := mDataSet.FieldCount;
mDataSet.First;
pZsDataToTreeNode(nil, 0, '');
vStringList.Free;
end;
{ ZsDataSetToTreeView }
 
这个sql必须先按照parent排序,其次按照id排序,也即order by parent,id
数据装载到dataset之后,一个递归就可以了。
显然,这是一个不限层数的数。
 
szhcracker, 谢谢.我用的是 VirtualstringTree
 
已经不需要了,谢谢各位
 
后退
顶部