请问这样的树型结构怎么实现?

suihu 2005-07-06 05:32:34
数据库里有 id,name两个字段,如下所示:
001 辽宁省
002 山东省
003 山西省
004 云南省
00101 沈阳市
00102 大连市
00201 青岛市
00202 龙口市
00203 荣成市
00301 太原市
00302 大同市
00401 东川市
0010101 和平区
0010102 铁西区
......
请问,要通过上面的ID制作出一个树型结构应该怎么实现?
...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GARNETT2183 2005-07-07
  • 打赏
  • 举报
回复
一样的嘛..把那些方法想清楚就可以了...
suihu 2005-07-07
  • 打赏
  • 举报
回复
自己做出来了。大家指点指点吧。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
ADOConn: TADOConnection;
Tree_dep: TTreeView;
ADOQuery1: TADOQuery;
Label1: TLabel;
ADOQuery2: TADOQuery;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure AddClass(FieldLen: integer;FatherNode:TTreeNode);
procedure AddChildClass(FieldLen: integer;FatherNode:TTreeNode;NameText:String);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AddClass(FieldLen: integer;FatherNode:TTreeNode);
var
RootNode:TTreeNode;
RootLabel:TLabel;
begin
AdoQuery1.Close;
AdoQuery1.SQL.Add('select * from pub_dep where Len(dep_id)='+Inttostr(FieldLen));
AdoQuery1.Open;
//SetLength(myNode,AdoQuery1.RecordCount+1);
while not AdoQuery1.Eof do
begin
RootNode:=Tree_dep.Items.AddChild(FatherNode,AdoQuery1.fieldbyname('dep_name').AsString);
RootLabel:=TLabel.Create(self);
RootLabel.Visible:=false;
RootLabel.Caption:=AdoQuery1.fieldbyname('dep_id').AsString;
RootNode.Data:=RootLabel;
AddChildClass(3,RootNode,AdoQuery1.FieldByName('dep_id').AsString);
AdoQuery1.Next;
end;
AdoQuery1.Free;

end;

procedure TForm1.AddChildClass(FieldLen: integer;FatherNode:TTreeNode;NameText:String);
var
AdoTmp:TAdoQuery;
SQLText:string;
myNode:TTreeNode;
myLabel:TLabel;
begin
AdoTmp:=TAdoQuery.Create(nil);
AdoTmp.Connection:=ADOConn;
AdoTmp.Close;
AdoTmp.SQL.Clear;
SQLText:='select * from pub_dep where len(dep_id)='+IntToStr(FieldLen+2)+' and left(dep_id,'+intToStr(FieldLen)+')='+quotedstr(NameText);
Memo1.Lines.Text:=Memo1.Lines.Text+chr(10)+chr(13)+SQLText;
AdoTmp.SQL.Add(SQLText);
AdoTmp.Open;
//SetLength(myNode,AdoTmp.RecordCount+1);
while not AdoTmp.Eof do
begin
myNode:=Tree_dep.Items.AddChild(FatherNode,AdoTmp.fieldbyname('dep_name').AsString);

//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=AdoTmp.fieldbyname('dep_id').AsString;
myNode.Data:=myLabel;
AddChildClass(FieldLen+2,myNode,AdoTmp.fieldbyname('dep_id').AsString);
AdoTmp.Next;
end;
//AdoTmp.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AddClass(3,nil);
end;

end.
suihu 2005-07-07
  • 打赏
  • 举报
回复
GARNETT2183(極品狼王):
  感谢您的回答,但是我需要的功能不是这样的,我只是把显示地区的这个表以树型的结构显示出来。
  比如说:辽宁省 包括 沈阳市、大连市 ,所以沈阳市和大连市属于辽宁省的子树,以此类推,青岛市、龙口市、荣成市就是山东省的子树...
  我就要实现这种方法,请问还有哪问能回答这个问题。
MudLib 2005-07-06
  • 打赏
  • 举报
回复
这问题真经典啊!
GARNETT2183 2005-07-06
  • 打赏
  • 举报
回复
最笨的方法:
比如说
id,name,place
1,张三,001
2,李四,004
3,李八,00401

//ADOTable1 是指 省份的表
//ADOTable2 是指 人员信息的表
var
PlaceNode: array of TTreeNode;
Node: array of TTreeNode;
PlaceString: array of String;
begin
SetLength(PlaceNode,ADOTable1.RecordCount+1);
SetLength(Node,ADOTable2.RecordCount+1);
SetLength(PlaceString,ADOTable1.RecordCount+1);
for i := 1 to ADOTabel1.RecoreCount do
begin
PlaceNode[i] := Tree1.Items.Add(nil,ADOTable1.fieldbyname('name').AsString);
PlaceString[i] := ADOTable1.fieldbyname('id').Asstring;
end;

for i:= 1 to ADOTable2.RecordCout do
begin
for j := 1 to High(PlaceNode) do
begin
if ADOTable2.fieldbyName('place').asstring = PlaceString[j] then
begin
Tree1.Items.AddChild(PlaceNode[j],ADOTable2.FieldbyName('name').AsString);
end;
end;
end;

end;
Rail100 2005-07-06
  • 打赏
  • 举报
回复
搜索论坛吧,这些问题已经被无数人问过,又被无数人解答过。
g961681 2005-07-06
  • 打赏
  • 举报
回复
没必要到这问吧!
lovend 2005-07-06
  • 打赏
  • 举报
回复
帮你顶

2,497

社区成员

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

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