把数据载入TREEVIEW问题

tgtcn 2009-01-22 10:42:55
数据表如下:
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自带的控件一样做得到的,请直接把实现的方法和代码,最好是适合数据量大一点的代码,告诉我,请朋友们能提供下。
...全文
148 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
GDTOPONE 2009-03-09
  • 打赏
  • 举报
回复
1.你的问题:
请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码.

2.我的回答:
DELPHI的建树初步代码,有待优化,只提供一般的方法(用DELPHI自带的TreeView控件)

3.我的数据库结构已固定了,因为它是一个软件的数据库来的,不可以随便更改的,从数据结构看,你给我看到的是唯一规则是:CODE字段.endflag 末级标志到了第三层就为TRUE,明显这个软件是三层树的.
tgtcn 2009-03-08
  • 打赏
  • 举报
回复
这种用CASE的方式对于CODE多时,不是很适合吧
GDTOPONE 2009-03-08
  • 打赏
  • 举报
回复
1.建表的SQL语句:

create table SHOWBOM(code varchar(10),[name] varchar(50), endflag varchar(10),pid INT)
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 测试通过。
ehappy 2009-03-08
  • 打赏
  • 举报
回复
用递归吧
lichy163 2009-03-08
  • 打赏
  • 举报
回复
简单,兄弟不用愁,我以前做过比你这个更复杂的,用treeviee可以做的
treeview是可以加图片在每个节点前面的,这样的话,你同一类的(同一级别的节点)就可以设置一个一样的图片,每个图片的imageindex不一样,另外treeview的每个节点都有一个指针data,你也可以把相关的参数附加到这个里面,通过treeview的click事件,把所选择的节点的相关参数提取出来去查相关的数据库,这样就把复杂的问题简单化了。
tgtcn 2009-03-08
  • 打赏
  • 举报
回复
最好能个范例我
ljluck7687 2009-01-22
  • 打赏
  • 举报
回复
编码很简单:
可根据code的长度来判断级数,如上述01为1级,0101为二级,。。。

如果是纯粹想显示成一个树状图形,不用treeview,也不用其他任何控件,就能做到,而且非常简单的处理就可做到
ljluck7687 2009-01-22
  • 打赏
  • 举报
回复
朋友,你的数据库设计可优化一下:
字段endflag和PID纯属多余,没有任何必要

数据内容应为:
code name
01 酒水
0101 白酒
0102 啤酒
010101 九江米酒
010102 小糊涂酒
010201 青鸟啤酒

如果数据量较大,则应存储为:
code name
001 酒水
001001 白酒
001002 啤酒
001001001 九江米酒
001001002 小糊涂酒
001002001 青鸟啤酒
其他情况类推
7年 2009-01-22
  • 打赏
  • 举报
回复
用SELECT语句选出CODE,NAME where PID=1做根目录,然后逐级加下。第二级就是where code=1.依次类推吧
bdmh 2009-01-22
  • 打赏
  • 举报
回复
思路
先把第一级数据取出,然后依次添加到Treeview
在TreeView的Expanding事件中写,根据该节点code,取出下级记录,然后添加到该节点下

这样做避免一次读入所有数据,速度太慢的问题,和windows资源管理器是一个原理
kye_jufei 2009-01-22
  • 打赏
  • 举报
回复

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;
tgtcn 2009-01-22
  • 打赏
  • 举报
回复
我的数据库结构已固定了,因为它是一个软件的数据库来的,不可以随便更改的
vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列表。 若想打印这些附注,请从“文件”菜单中选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 中移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其中包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接。 问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其中包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单中的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品中的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 中任何错误的修正都将包含在 Visual Studio Service Pack 中。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品中带有丰富的示例,其中有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 中可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品中所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。

2,497

社区成员

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

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