当前位置:主页>仓库管理软件> 列表

TreeView与数据库 困扰很久,无法解决 找金蝶财务软件的好处

财务软件版1楼: 一个Treeview显示一棵树,树的每个节点对映数据表中一条记录
数据表名为Dir,其结构为:
ID(节点编号),Caption(节点描述),Depth PID(父节点编号),责任人,其他责任人。
在点击选中TreeView中一个节点后,在Edit1,Edit2中分别显示“责任人”“其他责任人”,请问如何实现?
分不多了,谢谢大家!

2楼: 大家帮我看看是什么问题啊?
我的代码如下:
Node:=TreeView1.Selected.Text;
with .ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add(''select 责任人,其他责任人 from Dir'');
Sql.Add(''where Caption=:Node'');
Prepared:=true;
Open;
end;

while Not Eof do
begin
Edit1.Text:=ADOQuery1.FieldValues[''责任人''];
Edit2.Text:=ADOQuery1.FieldValues[''其他责任人''];
end;
请问应该怎么修改,请给出源码!
谢谢大家! 如财务软件免费版

3楼: Sql.Add(''select 责任人,其他责任人 from Dir '');//是不是应该分隔一下


Sql.Add(''where Caption="Node"'');

你哪里有错误?

4楼: 运行没有错误,ADOQuery连接也没有错误,在点击树节点后,显示I/O6错误

5楼: 你为什么不把表对象加到TreeView中去呢?那样你在点击一个节点的时候就不用再去查询了。

6楼: to huhaitaode
请问如何做呢?

eDuty.Text:=FieldValues[''责任人''];
错误提示类型不匹配,责任人是个可空字段。

财务软件版7楼: 要用动态查询,因每次选择的节点是不固定的

8楼: 如果node为string类别,可以如下写
Sql.Add(''where Caption=:Node'');
指定参数等于TreeView1.Selected.Text即可.

9楼: 从你这个问题来看数据量不大,在query中不需要加where,open的时候取全部数据集到本地,然后在点击Node的时候用Filter就可以了。
上段代码中,既然取回的是行集,就没有必要用while not eof 这段,再说,用了这段就得加上next,否则调试难以通过。

10楼: 方案:
表1:(存树结构)
id Name Father Level
表2:(树节点对应的文本)
id text
生成树时,对每个Node的Data付值为数据库中对应ID(节点编号),
选择接点时,得到接点Data,在表2中操作....

11楼: To:大器晚成,你怎么知道人家的数据量不大?那可是个表啊。随时会增加的哦。


我的意思是把表对象加到节点中,作为指针对象来处理啊。

12楼: 试试这样
begin
Close;
Sql.Clear;
Sql.Add(''select 责任人,其他责任人 from Dir'');
Sql.Add(''where Caption=:treeview1.selected.text'');
Prepared:=true;
Open;
end; 如金蝶财务软件的好处

13楼: type
TNodeDate=record
ID:string;
Caption:string;
PID:String;
P1:string;
P2:string;
end;
PNodeData=^TNodeData;

procedure CreateTree(PNode:TTreeNode);
var P:PNodeData;
CHN:TTreeNode;
begin
if PNode=Nil then
begin
CHN:=...;
P.ID:=AdoQuery1.fieldbyname(''ID'').asstring;
....
P.P1:=AdoQuery1.fieldbyname(''责任人'').asstring;
CHN.Data:=P;
....
end
else
begin
...
end;
end;


procedure Treeview1Click(Sender:Tobject);
var P:PNodeData;


begin
P:=TreeView1.selected.data;
Edit1.text:=P.P1;
Edit2.text:=P.P2;
.....
end;

财务软件版14楼: 同意lxian的答案

15楼: 谢谢大家了