怎么从数据库里面直接生成树(100分)

  • 主题发起人 主题发起人 shuzhenqiu520
  • 开始时间 开始时间
S

shuzhenqiu520

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么从数据库里面直接生成树?
表结构:XTBH
BT
LB
NR
 
试试下面的代码:
procedure LoadTree(treeDB:TDBDataSet);//初始化树
procedure UpdateTree(curNode:TTreenode;
nodeTxt:string;
state:string);//更新树
function GetNodeLevel(sFormat,sCode:string):integer;
//获得节点层数
function GetNodeItem(sCode:string):integer;//获得item
{ Public declarations }
end;

const
CTreeCodeFormat='122222';
cTreeMaxLevel=6;
CTreeRootTXT='所有图书';
var
tsgzlfrom: Ttsgzlfrom;
_err:integer;
curUser:string[10];
mystate:string;
gNodeId:string;
gNodelevel:integer;
gNode:TtreeNode;
mynode:array[0..6] of TTreenode;
i,Already,CurMode:integer;
currow:integer;
iniFile:string;
HasSub:String;
level:Integer;

implementation
uses bgNewunit;

{$R *.DFM}
procedure TtsgzlFrom.LoadTree(treeDB:TDBDataSet);//初始化树
var curID,nodeTxt:string;
level,num:integer;
begin
//初始化变量
Screen.Cursor:=crHourGlass;
tree.Enabled:=True;
tree.Items.Clear;
level:=1 ;
num:=1;
tree.items.clear;
//设置根节点
mynode[level]:=Tree.items.add(Tree.Topitem,cTreeRootTxt);
mynode[level].ImageIndex:=0;
mynode[level].SelectedIndex:=1;
//遍历数据表,利用编码字段记录排序规律,依次添加树节点
with TreeDbdo
begin
try
if not Active then
open;
first;
while not Eofdo
begin
curID:=trim(FieldByName('tsglb').AsString);
nodeTxt:=curID+'-'+trim(FieldByName('tsglbn').AsString);
level:=GetNodeLevel(cTreeCodeFormat,curID);
//这里返回代码的层次数
if level>0 then
begin
//增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。
//注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
mynode[level]:=Tree.Items.AddChild(Mynode[level-1],NodeTxt);
mynode[level].ImageIndex:=2;
mynode[level].SelectedIndex:=3;
end;
next;//下一条记录
end;
finally;
close;
end;
mynode[1].expand(False);
Screen.Cursor:=crHourGlass;
end;
end;

function TtsgzlFrom.GetNodeLevel(sFormat,sCode:string):integer;
var i,iLen:integer;
begin
level:=-1 ;
iLen:=0;
if (sFormat<>'') and (sCode<>'') then
for i:=1 to Length(sFormat)do
//分析编码格式,找出当前代码层次
begin
iLen:=iLen+StrToInt(sFormat);
if Length(sCode)=iLen then
begin
level:=i;
break;
end;
end;
result:=level;
end;

Function TtsgzlFrom.GetNodeItem(sCode:string):integer;//获得item
var i,iCount,val:integer;
tmp:string;
begin
Result:=0;
iCount:=Tree.Items.Count;
if iCount=0 then
exit;
val:=0;
for i:=1 to iCount-1do
begin
Tmp:=Tree.Items.Item.Text;
Tmp:=Copy(Tmp,0,pos('-',Tmp)-1);
if Tmp=sCode then
begin
val:=i;
Break;
end;
end;
result:=val;
end;

procedure TtsgzlFrom.UpdateTree(curNode:TTreenode;
nodeTxt:string;
state:string);
begin
if state='add' then
begin
curNode:=Tree.Items.addchild(curNode,nodeTxt);
curNode.ImageIndex:=2;
curnode.SelectedIndex:=3;
end;
if state='del' then
curNode.delete;
if state='edi' then
curNode.Text:=nodeTxt;
end;
 
我感觉这代码不是很经典
 
把数据库的数据直接辅给目录树,可以考虑写一个通用的函数来来辨别目录级数和所属目录的动作。这个功能不难,你试写一下。上边那位兄弟写的也能实现,但是没有达到重用的效果,要是有几百级,估计你累得够踉。------------------------只能给个思路,要是真搞不出来,给点水水我就搞,简单问题的免费劳动力咋就不干了
 
DXDBTREELIST控件,直接生成树。两个字段是父子关系就行。
 
有许多都是有规定的代码,各人实现的方式都不同
 
楼上得兄弟写给我看看啊
 
就用李翔鹏的 dxDBTreeList 最简单
 
构建类似于 ID PID NAME的 数据结构,可以用dbtree,我自己写过,加我QQ::18077968
 
后退
顶部