关于TREEVIEW的使用问题(200分)

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

szzgx

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠本人刚学DELPHI,有一TREEVIEW的问题请赐教:
(SQL server ; ADO)
假如有一部门表(DEPT)设计如下:
DeptId (部门代号) PdeptId (上级部门代号) DeptName(部门名称)
YF YF 研发部
YF1 YF 研发1部
YF2 YF 研发2部
XS XS 销售部

从数据库中创建树已完成。请问如何再添加和删除部门及子部门(如生产部、研发1部信息室)并写回数据库。
假定从Edit1中输入DeptId,从Edit2中输入DeptName.
Treeview.selected.text的内容为DeptName.

请给出程序或相关例子,200分敬上。谢谢

E-mail:zenggexin2002@hotmail.com
 
遍历每个节点进行写入。

或在修改时就对相应的记录进行修改。
 
选取节点后如何添加删除节点和子节点?
例如选择了研发部后要添加生产部和子部门研发3部?删除研发部呢?
 
删除时也用递归调用进行处理
 
添加的时候条件好像不是很明确,应为从表结构可以看出,应该由上级部门和部门标识来唯一确认
一条记录,而你在添加的时候只有部门标识和部门名称。我估计你是首先选择树节点,然后添加或者
删除,上级部门由选择节点来确定,是吗?还有树的结构是什么,是上级部门标识->部门标识
还是上级部门标识->部门名称还是别的什么?一般情况下应该是父节点名称为上级部门名称,节点本身
保存其代号,字节点名称为部门名称,节点保存其代号。如果是这样,问题就简单了。
添加:
根据选中的节点确定父节点;
在父节点下增加一子节点(部门代号,部门名称);
在库中插入该记录(父节点保存的代号,部门代号,部门名称);
删除:
根据选中的节点确定父节点
if 选中的是父节点 then
begin
删除父节点下的所有子节点(如果要求这样做的话);
删除父节点;
从库中删除上级部门代号为父节点所保存的代号;
end
else
begin
记录选中节点的保存的代号和节点名称;
删除选中的节点;
从表中删除该记录(父节点保存的代号,部门代号,部们名称);//第三个参数可以不用
end;
 
谢谢libra_1的细心指导.请帮我看看下面程序.
我想在选中结点后点击新建子部门按钮后在Edit中输入部门代号和部门名称;然后按保存按钮将数据输入到数据库.
procedure TF_deptmentsetup.B_newsubClick(Sender: TObject);
var
node:Ttreenode;
begin
node:=treeview1.Items.Addchild(treeview1.Selected ,'新部门');
treeview1.Selected:=node;
Edit1.setfocus;
end;

procedure TF_deptmentsetup.B_save1Click(Sender: TObject);
var
s,ParentId:string;
begin
s:=treeview1.Selected.Parent.Text ; //取得上级部门的名称
with DM.Q_dept do
begin
locate('DeptName',s ,[]); //定位到上级部门所在的记录
ParentId:=fieldbyname('DeptId').asstring; //得到上级部门的部门代号
insert; //插入到数据库中
fieldbyname('ParentId').asstring:=ParentId;
fieldbyname('DeptId').asstring:=Edit1.text;
fieldbyname('DeptName').asstring:=Edit2.text;
post;
end;
end;

但是发现不能定位到上级部门的记录.在数据库表中看到多了二条记录.
一条有DeptId和Deptname都有数值但ParentId数据为空.另一条DeptId和Deptname都为空但ParentId有数值且数值是错的数值为DeptId值.
不知程序错在哪里?请多多指教.

请各位大侠不吝赐教.
 
直接用dxDBTreeView完全可以用
 
程序有个小笔误

DeptId (部门代号) [red]PdeptId[/red] (上级部门代号) DeptName(部门名称)
fieldbyname('[red]ParentId[/red]').asstring:=ParentId;

除此之外,偶试了,用的是D6+ACCESS2000+ADO,在WIN2kSrever中
运行正常,并未出现你说的现象

另外你这种数据库设计有个小缺陷
考虑如下情况:
学校A---1年级---1班
学校A---1年级---2班
学校A---2年级---1班
学校A---2年级---2班
学校A---2年级---3班
学校B---1年级---1班


在你的数据库中
当偶想增加B学校1年级2班时
locate('DeptName',s ,[]); //定位到上级部门所在的记录
问题出现了
程序中
s='1年级'
数据库中对应的是A学校还是B学校呢?

偶的建议:
将"上级部门代号"字段改为对应树的整个路径

偶在实际工作中遇到过这样的问题,因为其它原因
不能给你原码
希望以上建议能所有帮助.
 
我正在做一个东西没作完不过
TREEVIEW与数据库相关的新增 修改 删除 拖动 都有 而且是无限层
要原代码的话写信给我就是。firemonk@sina.com
我所有的代码都是可以公开的
 
先取出所选结点相对应的记录,如果是删除的话,那就是一条SQL语句的事了,只要写一条SQL语
句就可以将所有父结点是所选结点的部门或是此部门的子部门(即儿子的儿子或儿子的孙子),
都可以删除.再将树刷新一遍就行了,如果是添加也一样呀,
 
请各位大侠多指教
 
to lyjgs.168:
不应该如此处理,必须先判断子部门是否被使用才能删除对应节点,否则全部删除了,
有的表使用了子部门怎么办?
 
首先我不知道你的定位函数是怎么写的,但是很明显你定位错误才引起插入数据错误,出现你
从表中看到的那些记录。
不知道你的父节点的Text是什么,从你的程序看,应该是上级部门代号吧,如果这样,
既然已知上级部门代号,为什么还要定位?如果怕重复,可以判断表中是否有该记录,
通过SELECT语句就行。如果你的父节点的Text存的是上级部门名称,那你的定位函数就是
错误的,应为你的表中存的是上级部门代号。
另外请注意,对于字符类型的字段,小心对空字符的处理,据我所致,SYBASE是自动
去掉字符串后面的空的字符,ORACLE则不是,如果有空字符,存到库中的也有空字符。你试一下
SQL SERVER 是怎么处理的。
 
谢谢大家.
libra_1前辈:
我的节点的text内容是部门名称.假如选择了研发1部,则treeview.selected.parent.text的内容是研发部.
我想通过上级部门名称研发部(唯一的)定位到部门名称为研发部的记录上即locate('DeptName',treeview.selected.parent.text);
用ParentId:=fieldbyname('DeptId').asstring 得到部门名称为研发部的 DeptId ;即为所选节点(部门名称)的父结点(上级部门名称)的DeptId,
然后作为新加节点的上级部门代号PdeptId.难道是错的吗?
按数据库添加的记录看是错的,因为数据库中PdeptId是空的,但我不知错在哪里.
请指教,谢谢.
 
你的函数写法有问题,你可以这么写

procedure TF_deptmentsetup.B_save1Click(Sender: TObject);
var
s,ParentId:string;
begin
s:=treeview1.Selected.Parent.Text ; //取得上级部门的名称
with DM.Q_dept do
begin
if Active := false
Active := true;
Filtered :=false;
Filter := 'DEPTNAME = ''' + s + '''';
Filtered := true;
ParentId:=fieldbyname('DeptId').asstring; //得到上级部门的部门代号
Filtered := false;
insert; //插入到数据库中
fieldbyname('ParentId').asstring:=ParentId;
fieldbyname('DeptId').asstring:=Edit1.text;
fieldbyname('DeptName').asstring:=Edit2.text;
post;
end;
end;

 
to 火龙真人:
请给我发一份TREEVIEW与数据库相关的源代码。谢谢!
xliu@pepris.com
 
给你们都两位发了
TO 游四海,
I will reply asap. Thank you. xliu@pepris.com
你的自动回复是吧
asap我猜意思是‘尽可能快的’猜得没错吧
 
后退
顶部