这个树应该怎么写?

jaybrownpage 2006-07-20 02:27:28
这是一个垃圾的数据库结构,但是没办法在不改变数据库结构的前提下,怎么写出树来?

lb dlbm zlbm xlbm miaoshu
大类 1 百货
中类 1 02 音响
小类 1 03 003 轮胎
这个怎么用treeview写成树
希望能祥细一点,本人初学!
...全文
168 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaybrownpage 2006-07-20
  • 打赏
  • 举报
回复
虽然说了数据库结构不能变,但你写了这么多,我还是要表示一下.
zchnnn_1981 2006-07-20
  • 打赏
  • 举报
回复
你这种结构不好写,加一个字段ParentID(即中类的父节点为大类ID,小类的父节点为中类ID),再用递归函数:
procedure TForm_Postion.InitTv(ParentNode: TTntTreeNode; ParentID: Integer);
Var
ADOInit:TADOQuery;
sqlstr:widestring;
PTv:Pinteger;
ChildNode:TTntTreeNode;
b_Last:boolean;
begin
ADOInit:=TADOquery.Create(self);
ADOInit.Connection:=DM.ADOCon;
TV.Items.BeginUpdate;
Try
if MainDisPostion.Checked then
sqlstr:='select * from Sys_Position where FiParentID='+IntToStr(ParentID)
else
sqlstr:='select * from Sys_Position where FbStop=0 and FiParentID='+IntToStr(ParentID);
with ADOInit do
begin
Close;
sql.Clear;
sql.Add(sqlstr);
Open;
end;
if ADOInit.RecordCount<>0 then
begin
while Not ADOInit.Eof do
begin
New(PTv);
PTv^:=ADOInit.Fieldbyname('ID').AsInteger;
ChildNode:=Tv.Items.AddChildObject(ParentNode,TTntWideStringField(ADOInit.Fieldbyname('FvName')).AsWideString,PTv);
if Not ADOInit.FieldByName('FbIsLast').AsBoolean then
begin
b_Last:=false;
ChildNode.ImageIndex:=0;
ChildNode.SelectedIndex:=0;
end
else
begin
ChildNode.ImageIndex:=1;
ChildNode.SelectedIndex:=1;
b_Last:=True;
end;

if Not b_Last then
InitTv(ChildNode,PTV^);
ParentNode.Expanded:=True;
ChildNode.Expanded:=True;
ADOInit.Next;
end;
end;
Finally
ADOInit.Free;
end;
Tv.Items.EndUpdate;
end;

调用:
Var
TreeNode:TTntTreeNode;
PT:Pinteger;
begin
Tv.Items.Clear;
New(PT);
PT^:=0;
TreeNode:=Tv.Items.AddChildObject(nil,顶级节点,PT);
InitTv(TreeNode,0);
end;
jabmoon 2006-07-20
  • 打赏
  • 举报
回复
通过sql语句查询,然后一层一层的挂上去,但是如果你的数据量大,最好不要一股脑做这个事情,最好先挂第一层,在第一层展开的时候,再挂子节点
jaybrownpage 2006-07-20
  • 打赏
  • 举报
回复
显示为:
-百货
-音响
轮胎音响

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧