TreeView的Data屬性問題

angelior 2003-10-21 09:55:36
为什么我用ADOQuery动态生成树的时候,我将TreeView的
node.data:= Tobject(FieldByName(primaryField).AsString);生成第一级后,当循环用ShowMessage(string(node.Data))显示时,都变化了,有时为空,有时为工程名,有时为乱码,我用的是一个ADOQuery作循环。


...全文
70 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmzgz81 2003-10-21
  • 打赏
  • 举报
回复
数据库结构:
部门ID 部门名称 上级部门ID
1 总部门 -1
2 部门1 1
3 部门2 1
4 部门3 1
5 分部门1 2
6 分部门2 2
7 分部门3 2
8 子部门1 5
9 子部门1 5
。。。。。。。。。。。
我想用递规的方法生成Treeview,程序如下:


这是我回答别人的问题答案! 和你的一样!

PROCEDURE TForm1.newtreeview(Node:TTreeNode;ID,Name:String);
var
tmpNode : TTreeNode;
ADOquery1 : TADOQuery;
Begin
//Treeview1。。。添加部门名称;
//Treeview1。。。添加附带数据部门ID
tmpNode := TreeView1.Items.AddChild(Node,Name);
ADOQuery1 := TADOQuery.Create(self);
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text := 'select * from 部门表 where 上级部门ID='+ID;
ADOQuery1.open;
If ADOQuery1.recordcount > 0 then
Begin
//Treeview1。。。准备添加子节点
ADOQuery1.First;
while not ADOQuery1.Eof do
Begin
Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsString,
ADOQuery1.FieldByName('部门名称').AsString);
ADOQuery1.next;
End;
End;
End;
angelior 2003-10-21
  • 打赏
  • 举报
回复
結貼

可以了

謝謝 cjfzy(他山之石,可以攻玉)

找到了原因,因為node.Data是創建后會被釋放,所以用個中間量來保存
tanqth 2003-10-21
  • 打赏
  • 举报
回复
我有一个控件DBTREE可以用数据库自动生成树,可以显示data,
帖子http://expert.csdn.net/Expert/TopicView1.asp?id=2259840

http://www.myjinsui.com/down/sort.asp?classid=9
下载
IORILI 2003-10-21
  • 打赏
  • 举报
回复
用node.text:= FieldByName(primaryField).AsString;
然後再ShowMessage(node.text)
angelior 2003-10-21
  • 打赏
  • 举报
回复
請問,是不是用一個ADOQuery的問題,我的算法是:
第一步:生成第一級節點

第二步:從第一級的最后一個NODE開始找它的子節點,ADOQuery的SQL.text也重寫過

第三步:在第二步中判斷新加的節點是否有子節點(用ADOQuery.RecordCount),有循環第二步
cjfzy 2003-10-21
  • 打赏
  • 举报
回复
因为Data是一个指针,所以要把指针负值给他。你可以这样:
1、先定义一个结构:
type //存储叶结点信息
PNode=^TNode;//指向TNODE的指针
TNode=record//这个结构
info1:string;
info2:string;
end;
2、再把数据库中读出来的值付给结构:
procedure readdata;
var RNode:PNode;
Trnode:TTreeNode;
begin
New(RNode);
RNode.info1:=FieldByName(字段名1).AsString;
RNode.info2:=FieldByName(字段名2).AsString;
Trnode:=treeview1.Items.AddChildObject(nil,FieldByName(字段名1).AsString,RNode);
end;
3、读出Data中数据时:
var str:string;

str:=PNode(treeview1.Selected.Data).info1;

就这样拉!有问题发消息给我!
angelior 2003-10-21
  • 打赏
  • 举报
回复
我不知三層

用到數據庫控件就由數據庫來生成了,不管有多少層
zzh54zzh 2003-10-21
  • 打赏
  • 举报
回复
TTreeViewData = record
primaryStr : String;
end;
……
var
TVData: ^TTreeViewData;

……
New(NewData);
NewData.primaryStr := FieldByName(primaryField).AsString;
node.Data := Newdata;
……
zhoutian618 2003-10-21
  • 打赏
  • 举报
回复
定义一个PString=^String类型吧。
chenkandy 2003-10-21
  • 打赏
  • 举报
回复
定義幾個treenode類比較好
看你有幾層

如果有三層,定義這樣阿 firstnode,secondnode
eg:
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('select primaryField,others from table order by primaryField');
adoquery1.Open ;
FirstNode:=treeview1.Items.Add(nil,'MyItems');
while not adoquery1.Eof do
begin
Secondnode:=treeview1.Items.Add(FirstNode,adoquery1.fieldbyname('primaryField').asstring);
adoquery1.Next ;
end;
treeview1.FullExpand;
類試這樣來添加樹結果

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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