谁给我一个treeview的实例支持多层子节点有添加删除功能最好与SQL_server或ACCESS数据库连接(100分)

  • 主题发起人 主题发起人 zgxzgx2002
  • 开始时间 开始时间
Z

zgxzgx2002

Unregistered / Unconfirmed
GUEST, unregistred user!
谁给我一个treeview的实例?右边用DBGrid 或 DBEdit等 显示。
支持多层子节点,有添加删除功能,
最好与SQL_server或ACCESS数据库连接;并给出数据库表谢谢。
100分敬上
E-mail: zgx1972@sina.com
 
我可以告诉你,这是我在实际工作中对树控件的总结,生成函数直接引用即可,记住一定要给分呀,我很穷。
zjw树的建立


首先,在库的构建上要有一定策略以下几个字段非常重要:
'codeID' 代码集名称 (例如:'AB')
'code' 节点代码 (例如:'新疆'节点的代码为'65','乌鲁木齐'的节点代码为'6501'等)
'description' 节点描述 (例如:如上面的'新疆'、'乌鲁木齐'等)
'pptr' 父节点代码 (例如:'乌鲁木齐'节点的父代码为'65',最高层节点的父节点代码可同其代码集,例如:'新疆'的父节点为 'AB')
'cptr' 子节点标识 (例如:该节点是否有下级节点,有则取值'1',没有则取值'0')



建立树由两部分构成:

procedure TForm1.FormActivate(Sender: TObject);
var
code_ID,new_sql,node_text,table_name:string;
new_node:Ttreenode;
begin

//要传递的参数
code_ID:='AB';
table_name:='sr_codeitem';

//********
treeview1.Items.BeginUpdate;

//清空所有项目
treeview1.Items.Clear;


new_sql:='select * from '+ table_name + ' where codeID='+''''+code_ID+''''
+ ' and '+'pptr='+''''+code_ID+'''';


//数据集中先筛选出所有要增加节点
with dm1.Query1 do
begin
close;
sql.Clear;
sql.Add(new_sql);
open;
//增加第一层节点
while not eof do
begin
node_text:=fieldbyname('code').asstring;
node_text:=node_text+' '+fieldbyname('description').asstring;
new_node:=treeview1.Items.add(nil,node_text);
new_node.HasChildren:=true;
next;
end;//end while
end;//end with

treeview1.Items.EndUpdate;
end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var
new_sql,node_text,child_text,code_ID,table_ID:string;
child_node:Ttreenode;
begin
//获取参数
code_ID:='AB';
table_ID:='sr_codeitem';

treeview1.Items.BeginUpdate;
node_text:=node.Text;
//截取所点击节点的code
node_text:=copy(node_text,1,pos(' ',node_text)-1);
with dm1.Query1 do
begin
close;
sql.Clear;
new_sql:='select * from '+table_ID+' where pptr='+''''+node_text+'''' + ' and codeID='
+''''+code_ID+'''';
sql.Add(new_sql);
open;//定位所点的项
//清除原来的下级节点
node.DeleteChildren;
while not eof do
begin//增加下级节点
child_text:=fieldbyname('code').asstring+' '+fieldbyname('description').asstring;
child_node:=treeview1.Items.AddChild(node,child_text);
if fieldbyname('cptr').asstring='1' then
child_node.HasChildren:=true;
next;
end;//end while

end;//end with
treeview1.Items.EndUpdate;
end;


第二部分:在 treeview 的onExpanding 事件中添加如下代码

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var
new_sql,node_text,child_text,code_ID,table_ID:string;
child_node:Ttreenode;
begin
//获取参数
code_ID:='AB';
table_ID:='sr_codeitem';

treeview1.Items.BeginUpdate;
node_text:=node.Text;
//截取所点击节点的code
node_text:=copy(node_text,1,pos(' ',node_text)-1);
with dm1.Query1 do
begin
close;
sql.Clear;
new_sql:='select * from '+table_ID+' where pptr='+''''+node_text+'''' + ' and codeID='
+''''+code_ID+'''';
sql.Add(new_sql);
open;//定位所点的项
//清除原来的下级节点
node.DeleteChildren;
while not eof do
begin//增加下级节点
child_text:=fieldbyname('code').asstring+' '+fieldbyname('description').asstring;
child_node:=treeview1.Items.AddChild(node,child_text);
if fieldbyname('cptr').asstring='1' then
child_node.HasChildren:=true;
next;
end;//end while

end;//end with
treeview1.Items.EndUpdate;
end;
 
已發送,請接收!
 
谢谢SPYSKY你的例子好好像不支持多层子节点。
谢谢ZJWYYH,能给我更多功能吗?如删除添加节点,分不够再加
 
谁给我一个祥细一点的treeview的实例?右边用DBGrid 或 DBEdit等 显示。支持多层子节点,有添加删除功能,
 
要支持多層子節點還不容易嗎?
你定義TTreeNode數組呀,多少層都可以給你實現。
我最多做過三層的,源碼不適合你,
不過我還有一個例子可以給你,你一定能實現,有問題再聯系
unit fratree;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, Mask, DBCtrls, ComCtrls, ExtCtrls, ImgList;
const
cTreeCodeFormat='122222';
cTreeMaxLevel=6;
cTreeRootTxt='單位字典';
type
TframTree1 = class(TForm)
Tree: TTreeView;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
Label1: TLabel;
Label2: TLabel;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
procedure TreeClick(Sender: TObject);
private
{ Private declarations }
public
procedure LoadTree(treeDB:TDBDataSet);
procedure UpdateTree(curNode:TTreenode;nodeTxt:string;state:string);
function GetNodeLeveL(sFormat,sCode:string):integer;
{ Public declarations }
end;

var
framTree1: TframTree1;

implementation

{$R *.DFM}
uses DM;
function TframTree1.GetNodeLeveL(sFormat,scode:string):integer;
var i,level,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;

procedure TframTree1.LoadTree(treeDB:TDBDataSet);
var curID,nodeTxt:string;
level,chindex,cnode,num:integer;
mynode:array[0..6] of TTreenode;
begin
//初始化變量
screen.cursor:=crHourGlass;
tree.Enabled:=true;
tree.Items.clear;
level:=0;
num:=1;
tree.items.clear;
//設置根節點
mynode[level]:=tree.Items.add(Tree.Topitem,cTreeRootTxt);
mynode[level].ImageIndex :=1;
with TreeDB DO
begin
try
if not Active then open;
first;
while not Eof do
begin
curID:=trim(FieldByName('dwDM').Asstring);
nodeTxt:=curID+'-'+trim(FieldByName('dwqc').Asstring);
level:=GetNodelevel(cTreeCodeFormat,curID);
//這裡返回代碼的層次數
if level>0 then
begin
//增加下一節點時,用添加子節點的方法可輕鬆實現節點間的層次關系
//注意:這裡的父節點是用當前節點的上一級節點
mynode[level]:=tree.items.addchild(mynode[level-1],nodeTxt);
mynode[level].imageIndex:=2;
end;
next;
end;

finally;
close;
end;
mynode[0].expand(true);
screen.cursor:=crHourGlass;
end;
end;

procedure TframTree1.UpdateTree(curNode:TTreenode;nodeTxt:string;state:string);
begin
if state='add' then
begin
curNode:=tree.items.addchild(curNode,nodeTxt);
curNode.imageIndex:=2;
end;
if state='del' then curNode.delete;
if state='edi' then curNode.text:=NodeTxt;
end;
procedure TframTree1.FormCreate(Sender: TObject);
begin
with DM_.Table1 do
begin
open;
indexFieldNames:='DWDM';
active:=true;
end;
framTree1.LoadTree(dm_.table1);
//DM_.table1.First ;
end;

procedure TframTree1.TreeClick(Sender: TObject);
var
temp,recID,gNodeID:string;
n,m:integer;
gNodelevel,curlevel:integer;
gNode:TTreenode;
begin
gNode:=FramTree1.tree.selected;
n:=pos('-',gNode.text)-1;
recID:=Copy(gNode.text,1,n);
gNodeID:=recID;
if gNode.text<>'單位字典' then
begin
with dm_.table1 do
begin
open;
//active:=true;
FindNearest([recID]);
end;
curlevel:=FramTree1.getnodelevel(cTreeCodeFormat,recid)+1;
end
else
curlevel:=1;
end;

end.
 
to:fxjpost
能给我一份三层的吗?多谢.
Email:nmfx1122@163.net
 
刚做了一个,层数理论上无限
http://www.ringxi.com.cn/filse/treeview.zip
 
to 笑幺:
网站打不开能发一份吗谢谢。
zgx1972@sina.com
 
多人接受答案了。
 
to:fxjpost
能给我一份三层的吗?多谢.
Email:stevensoft@163.com
 

Similar threads

后退
顶部