关于treeview的用法(与数据库进行联系)?

tgtcn 2003-08-19 03:27:09
我想自已做一个通讯录
类别和用户:可以随意在任一节点上增加
比如: 同学录
-----谭丽丽
----小学同学
------小强
----高中同学
----大学同学
同事
----中山电讯
----江西机电
---袢达
---科龙

我想达到以下的介面要求.

分左右两个界面
左边是TREEVIEW的列表,可以随意节点上用实际两大功能:(1)增加同级节点和下级节点,(2)并且在该节点上可以增加用户记录

右边的界面:
是当选择左边相应的类别时,右边的表格就显示出该类别下全部的用户,并且可以可以修改.
比如我单击左边"小学同学",右边就显示出所有的小学同学信息列表

我的同学录有如下字段(简单一点):
姓名,电话地址,工作单位

如果实现以上功能数据表的结构要增加什么字段呢?如何才能随意增加节点呢?


请网上的大虾们老师们指导一下我.编程思想也好.最好是能做一个实例出来.并解释下怎解要这样做.我相信有很多朋友都想知道这是怎样做的.如果有哪位朋友做了实例出来请发到tgt168@21cn.com 拿来到结果后我一定会把分数奉上,唔够再加.
...全文
97 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjhjh 2003-10-11
  • 打赏
  • 举报
回复
楼上的,你有FOR D7 的吗?

没有,不有也罢!!
tanqth 2003-10-08
  • 打赏
  • 举报
回复
补充两句:

数据库中重要的只有两样,
1、编码、(可以是定长编码如,“222”为三级树,每级两位编码,
01 一级
0101 二级
010101 三级
也可以是不定长,用规定符号将每级编码分开,
01 一级
01-1 二级
01-1-111 三级
01-332 二级
01-332-1 三级 (两个二级编码长度不一样)

2、编码名:(节点名)

(1)增加同级节点和下级节点,

其实就是增加编码,我没写,你可以自己加上去;

(2)并且在该节点上可以增加用户记录

也很简单,就不说了。
tanqth 2003-10-08
  • 打赏
  • 举报
回复
我觉得以上方法有点烦,我有一个TREE控件,你可以去看看。很简单的。

http://expert.csdn.net/Expert/topic/2259/2259840.xml?temp=.3159754
直接下载请到:
http://www.myjinsui.com/down/sort.asp?classid=9
gdwyh 2003-10-08
  • 打赏
  • 举报
回复
学习
itperson 2003-10-08
  • 打赏
  • 举报
回复
给我也来一份

longrichardson@163.com
youngyuer 2003-10-08
  • 打赏
  • 举报
回复
正好有一个现成的例子,
youngyuer@163.com
bjhjh 2003-10-07
  • 打赏
  • 举报
回复
高度关注!

拜托,MAIL给我一个实例bj_hjh2@sohu.com


thanks!!
MaxPyne 2003-08-25
  • 打赏
  • 举报
回复
我最近也在做TREEVIEW,挺多的,自己想了一些,但还有一些没解决,能否MAIL给我一个实例,参考一下,多谢!!!! mksl@sohu.com
tgtcn 2003-08-25
  • 打赏
  • 举报
回复
你是实例只是保存了左边的信息:代码如下:unit Unit1;

interface

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

type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure AddClass(AId:integer;FatherNode:TTreeNode);//添加分类过程
procedure AddDataToDB(CurrNode,FatherNode:TTreeNode);//添加实际数据到数据库
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from tb1');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);

//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;

AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
QryTmp.Next;//什么是递归调用过程,有什么作用啊?
end;
QryTmp.Free;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('新增','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.Add(treeview1.Selected,strName);
if assigned(treeview1.Selected) then
AddDataToDB(myNode,treeview1.Selected.Parent)
else
AddDataToDB(myNode,nil);
myNode.selected:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('新增','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.AddChild(treeview1.Selected,strName);
AddDataToDB(myNode,treeview1.Selected);
myNode.selected:=true;
end;

procedure TForm1.AddDataToDB(CurrNode,FatherNode: TTreeNode);
var
myLabel:TLabel;
QryTmp:TADOQuery;
AId:integer;
begin
if not assigned(FatherNode) then//assingned()是什么作用
AId:=0
else if not assigned(FatherNode.Data) then
AId:=0
else
AId:=strtoint(TLabel(FatherNode.Data).caption);
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from tb1');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
QryTmp.Append;
QryTmp['FatherId']:=AId;
QryTmp['CName']:=CurrNode.Text;
QryTmp.Post;

//创建记录currNode的AutoId表识标
myLabel:=TLabel.Create(self);
myLabel.Visible:=False;
MyLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
CurrNode.Data:=myLabel;

QryTmp.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
QryTmp:TADOQuery;
begin
if not assigned(treeview1.Selected) then
exit;
if application.MessageBox('是否删除分类及下级分类?','提示',mb_yesno+mb_iconquestion)=idno then
exit;
//删除下级别分类
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('delete * from tb1');
QryTmp.SQL.Add('where FatherId='+TLabel(Treeview1.Selected.data).Caption);
QryTmp.ExecSQL;
QryTmp.SQL.Clear;
QryTmp.SQL.Add('delete * from tb1');
QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
QryTmp.ExecSQL;
Treeview1.Selected.Delete;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
QryTmp:TADOQuery;
strName:string;
begin
if not assigned(treeview1.Selected) then
exit;
strName:=inputbox('更改','请输入新的名称: ','');
strName:=trim(strName);
if strName='' then
exit;
//删除下级别分类
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('update tb1 set CName='+''''+strName+'''');
QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
QryTmp.ExecSQL;
Treeview1.Selected.Text:=strName;
end;

end.

我结合HitomiWP(理想国度)的贴试一试.

hairhair 2003-08-25
  • 打赏
  • 举报
回复
我发了一个实例到你的邮箱了
HitomiWP 2003-08-19
  • 打赏
  • 举报
回复
你可以把TreeView中要显示的东西建一个表(如Table1),右边界面的东西建一个表(如Table2)。
table1中的必要字段:LongID(类型:char)。该字段是记录的每一个接点的编号。它包含两部分:1)父接点;2)接点唯一标示号。如:000001,表示父接点为000,该接点的唯一标示号为001(两部分长度必须一致,根接点代码设为“ 000”,000前面是三个空格)。
为Form1的OnCreate事件添加代码:
procedure TForm1.FormCreate(Sender: TObject);
var p:Pstr;Node:TTreeNode;
begin
with Table1,Treeview1 do
begin
open;
first;
new(p);{为指针p分配内存}
p^:=FieldByName(′LongID′).AsString;
Node:=Items.AddChildObject(nil,FieldByName(′Text′).AsString,p);
if HasSubInDbf(Node) then Items.AddChildObject(Node,′ ′,nil);{有子节点则加一个空子节点}
end;
end;
HasSubInDbf为自定义函数,自变量为Node,检查节点Node有无子节点,有则返回True,反之返回False,并在TForm1的类定义里加入原型声明(其它自定义函数的原型也在TForm1的类定义里声明,不另作解释),函数代码如下:
function TForm1.HasSubInDbf(Node:TTreeNode):Boolean;
begin
with Table1 do
begin
Table1.FindNearest([copy(Pstr(Node.Data)^,4,3)+′000′]);
result:=copy(FieldByName(′LongID′).AsString,1,3)=copy(Pstr(Node.Data)^,4,3);{如数据库里当前记录的LongID字段内容的前3位和节点Node的Data的后3位相同,则Node应该有子节点}
end;
end;
为TreeView1控件的OnDeletion事件添加代码,需要指出的是,不仅调用Delete方法可以触发OnDeletion事件,而且当树控件本身被释放前,也触发OnDeletion事件,所以,在此处加入dispose(node.data)会很“安全”:
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
Dispose(Node.Data);{释放节点数据内存}
end;
为Add1选单项的OnClick事件添加代码如下:
procedure TForm1.Add1Click(Sender: TObject);
var p:pstr;Tmpstr:string;i:integer;
begin
try
StrToInt(Edit2.Text);
Tmpstr:=Edit2.Text;{注:在实用中,必须用更好的方法来产生ID}
except;
ShowMessage(′重新输入Edit2的内容′);
abort;
end;
with TreeView1 do
begin
new(p);
p^:=copy(Pstr(Selected.Data)^,4,3)+TmpStr;
Items.AddChildObject(Selected,Edit1.Text,p);
end;
with Table1 do{ 在数据库里添加记录 }
begin
Append;
FieldByName(′Text′).AsString:=Edit1.text;
FieldByName(′LongID′).AsString:=p^;
Post;
end;
TmpStr:=inttostr(strtoint(TmpStr)+1);
for i:=length(TmpStr) to 2 do TmpStr:=′0′+TmpStr;
Edit2.Text:=TmpStr;
end;
为Del1菜单项的OnClick事件添加代码如下:
procedure TForm1.Del1Click(Sender: TObject);
var DelList:TStringList;LongID,NSubLongID:string;
begin
DelList:=TStringList.create;
DelList.Sorted:=True;
DelList.Add(Pstr(TreeView1.Selected.Data)^);
while DelList.Count>0 do
begin
LongID:=DelList.Strings[0];
DelList.Delete(0);
Table1.SetKey;
Table1.FieldByName(′LongID′).AsString:=LongID;
if Table1.GotoKey then Table1.Delete;
if HasSubInDbf(TreeView1.Selected) then
begin
NSubLongID:=Table1.FieldByName(′LongID′).AsString;
while (copy(NSubLongID,1,3)=copy(LongID,4,3))and(not Table1.Eof) do
begin
dellist.Add(NSubLongId);
Table1.Next;
NSubLongId:=Table1.FieldByName(′LongID′).AsString;
end;
end;
end;
DelList.Free;
TreeView1.Items.Delete(TreeView1.Selected);
end;
为TreeView1的OnExpanding事件添加代码:
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var TmpNode:TTreeNode;NSubLongID:String;p:Pstr;bm:TBookMark;
begin
with Table1,TreeView1 do
begin
Items.BeginUpdate;
SetKey;
FieldByName(′LongID′).AsString:=Pstr(Node.Data)^;
if not GotoKey then Items.Delete(Node)
else
begin
TmpNode:=Node.GetFirstChild;
if (TmpNode.Text=′ ′)and(TmpNode.Data=nil) then
begin
TmpNode.Delete;
if HasSubInDbf(Node) then
begin
NSubLongID:=FieldByName(′LongID′).AsString;
while (copy(NSubLongID,1,3)=copy(Pstr(Node.Data)^,4,3))and(not Eof) do
begin
new(p);
p^:=FieldByName(′LongID′).AsString;
bm:=GetBookMark;
TmpNode:=Items.AddChildObject(Node,FieldByName(′Text′).AsString,p);
if HasSubInDbf(TmpNode) then Items.AddChildObject(TmpNode,′ ′,nil);
GotoBookMark(bm);
FreeBookMark(bm);
Next;
NSubLongId:=FieldByName(′LongID′).AsString;
end; end; end;
end;
Items.EndUpdate;
end;
end;
santafeng 2003-08-19
  • 打赏
  • 举报
回复
我也要一个例子,刚学Delphi还要做项目,做TreeView不会谢谢.
Email:Santafeng@yeah.net


雨后阳光2000 2003-08-19
  • 打赏
  • 举报
回复
procedure TFrameTree.LoadTree(treeDB:TDBDataSet);//初始化树
//initial tree when main form create
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('dwbm').AsString);
nodeTxt:=curID+'-'+trim(FieldByName('dwqc').AsString);
level:=GetNodeLevel(cTreeCodeFormat,curID);
//返回代码的层次数
if level>0 then
begin
//添加下一节点时,用添加子节点的方法可轻松实现节点间层次关系
//注:这里的父节点是用当前节点的上一级节点mycode[level-1]
mynode[level]:=tree.items.addchild(mynode[level-1],nodeTxt);
if level>4 then
mynode[level].ImageIndex:=3
else
mynode[level].ImageIndex:=1;
// mynode[level].tag:=curID;
end;
next;
end;
finally;
close;
End;
mynode[0].expand(False);
Screen.Cursor:=crDefault;
end;
end;
Spqk005 2003-08-19
  • 打赏
  • 举报
回复
表结构
ID
PID 父ID
Layer 层次
Name 名字
HasChild


sy_315 2003-08-19
  • 打赏
  • 举报
回复
如果还是不十分清楚的话,那就email to me
我回去整理出一个实例送你。
sy_315 2003-08-19
  • 打赏
  • 举报
回复
我找到我当年的sql语句了,就是针对treeview所建的数据库,你可以参考一下:
CREATE TABLE "tree"("ID" VARCHAR2(10), "树层" VARCHAR2(5),"字段名" VARCHAR2(30),"节点号" VARCHAR2(10),"父节点号" VARCHAR2(5))TABLESPACE "CYNTHIA";
insert into "tree" values('0','0','市场管理','1','0');
insert into "tree" values('0','1','承包申请表','2','1');
insert into "tree" values('0','1','申请分承包方名录','3','1');
insert into "tree" values('0','1','承包方考核评分','4','1');
insert into "tree" values('0','1','入网队伍资质审查','5','1');
insert into "tree" values('0','1','合格份承包方名录','6','1');
insert into "tree" values('0','1','技术服务项目计划','7','1');
insert into "tree" values('0','1','分承包方工程实施','8','1');
insert into "tree" values('0','1','技术服务质量反馈','9','1');
nsert into "tree" values('0','1','勘探合同','10','1');
insert into "tree" values('0','0','综合管理','11','0');
insert into "tree" values('0','1','石油地质专业委员','12','11');
insert into "tree" values('0','1','石油学会会员','13','11');
insert into "tree" values('0','1','石油学会工作计划','14','11');
insert into "tree" values('0','1','专业队伍对外服务','15','11');
insert into "tree" values('0','1','专业队伍状况','16','11');
insert into "tree" values('0','0','装备管理','17','0');
insert into "tree" values('0','1','设备情况统计表','18','17');
insert into "tree" values('0','1','队伍装备规划','19','17');
insert into "tree" values('0','1','计划执行计划','20','17');
insert into "tree" values('0','1','主要软件汇总表','21','17');
insert into "tree" values('0','0','质量管理','22','0');
insert into "tree" values('0','1','监督人员汇总表','23','22');
insert into "tree" values('0','1','总监考核表','24','22');
insert into "tree" values('0','1','监督考核表','25','22');
insert into "tree" values('0','1','探井交接表','26','22');
insert into "tree" values('0','1','指标汇总表','27','22');
insert into "tree" values('0','1','监督统计表','28','22');
insert into "tree" values('0',1'','购制明细表','29','22');
insert into "tree" values('0','0','技术发展管理','30','0');
insert into "tree" values('0','1','现状汇总','31','30');
insert into "tree" values('0','1','实例汇总','32','30');
insert into "tree" values('0','1','需求汇总','33','30');
insert into "tree" values('0','1','情况汇总','34','30');

说明:数层为0代表是父亲结点,1为子结点。在父结点号中,父亲结点为0,子结点为父亲结点号
sy_315 2003-08-19
  • 打赏
  • 举报
回复
我有实际的例子,不过很大的,晚上有时间回去整理一下
我的email:sy_315@163.com
我把思想先告诉你
有没有子结点
if TreeView1.Selected.HasChildren then
有没有父结点
if TreeView1.Selected.Parent=nil then
其实你可以把整个数建成一个表:
parent child1_relative child_no ...child2 child3
1 1 3
2 2 4
2 2 5

3是1的孩子,4,5是1的孩子,1,2都是父亲结点

2,497

社区成员

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

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