数据表如下:
code 分类代码
name 分类名称
endflag 末级标志
pid 所在层次
内容如下:
code name endflag PID
1 酒水 false 1
101 白酒 false 2
102 啤酒 false 2
1010001 九江米酒 true 3
1010002 小糊涂酒 true 3
1020001 青鸟啤酒 true 3导入的结果是:
1酒水
101白酒
1010001九江米酒
1010002小糊涂酒
102啤酒
1020001青鸟啤酒
请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码,我也查过有朋友也问过这个问题,但回答都不是直接回答,只是叫用DXTREEVIEW,我也不知道这个控制怎样用的,我相信DELPHI自带的控件一样做得到的,请直接把实现的方法和代码,最好是适合数据量大一点的代码,告诉我,请朋友们能提供下。
code 分类代码
name 分类名称
endflag 末级标志
pid 所在层次
内容如下:
code name endflag PID
1 酒水 false 1
101 白酒 false 2
102 啤酒 false 2
1010001 九江米酒 true 3
1010002 小糊涂酒 true 3
1020001 青鸟啤酒 true 3导入的结果是:
1酒水
101白酒
1010001九江米酒
1010002小糊涂酒
102啤酒
1020001青鸟啤酒
请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码,我也查过有朋友也问过这个问题,但回答都不是直接回答,只是叫用DXTREEVIEW,我也不知道这个控制怎样用的,我相信DELPHI自带的控件一样做得到的,请直接把实现的方法和代码,最好是适合数据量大一点的代码,告诉我,请朋友们能提供下。
先把第一级数据取出,然后依次添加到Treeview
在TreeView的Expanding事件中写,根据该节点code,取出下级记录,然后添加到该节点下这样做避免一次读入所有数据,速度太慢的问题,和windows资源管理器是一个原理
字段endflag和PID纯属多余,没有任何必要数据内容应为:
code name
01 酒水
0101 白酒
0102 啤酒
010101 九江米酒
010102 小糊涂酒
010201 青鸟啤酒如果数据量较大,则应存储为:
code name
001 酒水
001001 白酒
001002 啤酒
001001001 九江米酒
001001002 小糊涂酒
001002001 青鸟啤酒
其他情况类推
可根据code的长度来判断级数,如上述01为1级,0101为二级,如果是纯粹想显示成一个树状图形,不用treeview,也不用其他任何控件,就能做到,而且非常简单的处理就可做到
procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
var
iLoop:Integer;
Master,MasterNode:TTreeNode;
begin
adoq_getop.Close;
//SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
adoq_getop.Open;
adoq_getop.First;
cx_TV.Items.BeginUpdate;
cx_TV.Items.Clear;
Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
while not adoq_getop.Eof do
begin
if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
begin
Screen.Cursor:=crSQLWait;
MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
Application.ProcessMessages;
qry_op.Close;
qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
qry_op.Open;
for iLoop:=0 to qry_op.RecordCount -1 do
begin
cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
qry_op.Next;
end;
Application.ProcessMessages;
cx_TV.Items.EndUpdate;
Screen.Cursor:=crDefault;
end;
adoq_getop.Next;
Application.ProcessMessages;
end;
{
ThreadTView:=cx_TV;
ViewThread:=TExpandLH.Create;
ViewThread.Resume;
}
end;
treeview是可以加图片在每个节点前面的,这样的话,你同一类的(同一级别的节点)就可以设置一个一样的图片,每个图片的imageindex不一样,另外treeview的每个节点都有一个指针data,你也可以把相关的参数附加到这个里面,通过treeview的click事件,把所选择的节点的相关参数提取出来去查相关的数据库,这样就把复杂的问题简单化了。
insert SHOWBOM select '1','酒水','false',1
union all select '101','白酒','false',2
union all select '102','啤酒','false',2
union all select'1010001','九江米酒','true',3
union all select'1010002','小糊涂酒','true',3
union all select'1020001','青鸟啤酒','true',3
/*
SELECT * FROM showbom
---结果:
1 酒水 false 1
101 白酒 false 2
102 啤酒 false 2
1010001 九江米酒 true 3
1010002 小糊涂酒 true 3
1020001 青鸟啤酒 true 3
*/
2:DELPHI的建树初步代码,有待优化,只提供一般的方法(用DELPHI自带的TreeView控件):procedure TForm1.btn1Click(Sender: TObject);
var
List: TStringList;
Nodea,Node,nodec: TTreeNode;
Index: Integer;
i:Integer;
str:string;
begin
with qry1 do begin{--qry1是TADOQuery控件--}
Open;
if not IsEmpty then begin
TreeView1.Items.BeginUpdate;
TreeView1.Items.Clear;
List := TStringList.Create;
Nodea:=TreeView1.Items.AddFirst(nil,'展BOM');{最顶层大标题}
List.AddObject('展BOM',nodea);
while not eof do begin
i:=Length(Trim(FieldByName('code').AsString));
case i of
1:begin
Node := TreeView1.Items.AddChild(nodea,FieldByName('code').AsString+
FieldByName('name').AsString);
List.AddObject(FieldByName('code').AsString,node);
end;
3:begin
str:=FieldByName('code').AsString;
Index := List.IndexOf(Copy(str,1,1));
nodec := TreeView1.Items.AddChild(TTreeNode(List.Objects[Index]),
FieldByName('code').AsString+
FieldByName('name').AsString); List.AddObject(str,nodec);
end;
else begin
str:=FieldByName('code').AsString;
Index := List.IndexOf(Copy(str,1,3));
nodec := TreeView1.Items.AddChild(TTreeNode(List.Objects[Index]),
FieldByName('code').AsString+
FieldByName('name').AsString); List.AddObject(str,nodec);
end; end;
next;
end;
TreeView1.Items.EndUpdate;
List.Free;
end;
end;
end;
3:本代码DELPHI 2009 测试通过。
请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码.2.我的回答:
DELPHI的建树初步代码,有待优化,只提供一般的方法(用DELPHI自带的TreeView控件)3.我的数据库结构已固定了,因为它是一个软件的数据库来的,不可以随便更改的,从数据结构看,你给我看到的是唯一规则是:CODE字段.endflag 末级标志到了第三层就为TRUE,明显这个软件是三层树的.