关于TTreeView的父节点问题 (50分)

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

ssh78

Unregistered / Unconfirmed
GUEST, unregistred user!
我的数据表里有这样两条记录:
id parent_id caption code
35 23 XXXX公司 20010002
36 35 王二 0003
生成树形如下:
用户管理
XXXX公司
王二
当我点击王二时,怎样知道他父节点XXXX公司的code呢?
 
TreeNode对象有个Data属性,可以存指针,把它节点ID记录到这里面
如果还不清楚发Email给我sungirl1126@21cn.com
 
建立节点的时候将Code放到Data里就可以了
 
这种结构我通常的做法是:
1 建一个记录:记录中包括各字段的值。
2 申请该记录类型的指针,并分配空间赋值
3 把此指针赋给NODE的DATA 属性。

 
type//可以先定义一个,记录类型
Treeifor = ^TMyRec;
TMyRec = record
ID : string;//id号
caption : string;//名称
code:String;
Tag : Integer;
end;
在实现的时候有两种方法,
1:
var
temp:TtreeNode;
WZInfo:Treeifor;
begin
New(WZInfo);
WZInfo^.ID:=table.FieldValues['id'];
WZInfo^.code:=table.FieldValues['code'];
WZInfo^.caption:=table.FieldValues['caption'];
WZInfo^.Tag:=namber;
//第一种方法
temp:=TreeView.Items.AddChildObject(TreeNode//是已知的结点,WZInfo^.caption,WZInfo);
//第二种方法
你可以使用普通的方法创建节点(TreeNode),创建后给TreeNode的Data
属性赋值也可以,aNode.Data := WZInfo;但我很少用这种方法.
调用的时候:
//取出code:Treeifor(TreeView1.Selected.TreeNode.Data)^.code
//取出ID:Treeifor(TreeView1.Selected.Data)^.ID
//取出caption:Treeifor(TreeView1.Selected.Data)^.caption
后面的事你知道该怎么办了吧,




 
不好意思,我这个“XXXX公司、20010002”是这样加入节点和数据库的:
用Table2从一个公司信息表里取这两个字段,并用TDBGrid显示。然后用一个按钮添加:
with DBTreeView1.addchild(DBTreeView1.selected,DBGrid1.Fields[0].AsString) do
begin
table1.edit;
table1.FieldByName('code').AsInteger:=DBGrid1.Fields[1].AsInteger;
table1.post;
end;
所以,我无法将code加到data里去
 
function tform4.DbFindPrtBybh(var ATvw: TTreeView; Da: string):TTreeNode;
var
I:integer;
begin
result:=nil;
for I:=ATvw.Items.Count-1 downto 0 do
if Dtinfo(ATvw.Items.Data).id=Da then
begin
result:=ATvw.Items;
exit;
end;
end;

function tform4.DbShowTreeView(var ATreeView: TTreeView): boolean;
var
Node,ParNode:TTreeNode;
begin
with datamodule2.ADOqfl do
begin
try
first;
treeview1.Items.BeginUpdate ;
while not eof do
begin
ParNode:=DbFindPrtBybh(ATreeView,fields.fieldbyname('intparent').AsString);
new(DtPoint);
DtPoint^.id:=fields.fieldbyname('intid').asstring;
DtPoint^.str:=fields.fieldbyname('Nvchyjsf').asstring;
Dtpoint^.fl :=fields.fieldbyname('flofl').asstring;
Node:=ATreeView.Items.AddChildObject(ParNode,fields.fieldbyname('nvchflmc').AsString,DtPoint);
Next;
application.ProcessMessages ;
end;
result:=true;
treeview1.Items.EndUpdate ;
except
result:=false;
end;
end;
end;
 
不能用DBTreeView1.selected.id连接么?
 
兄弟们,不如咱们换一种方法。
我把树变成这样显示:
用户管理
20010002 XXXX公司
0003 王二
就是显示的text变成code+''+caption
这样总可以取这个20010002了吧?
问题变成:怎样取treenode.text中空格前面的字符或者取前8位?
 
var a,code:String;
s:integer;

a:=treenode.text;
s:=pos(' ',a);
code:=copy(a,1,s-1);
 
同意楼上。不过这样不是降低水平吗
 
>>id parent_id caption code
》 35 23 XXXX公司 20010002
》》36 35 王二 0003

用SQL呢?
select code from table
where id=(select parentid from table where caption='王二');
 
上面的都已经说了, 呵呵,
 
查找数据库,或在建树时放到节点的相关属性中。
 
标记一下,明天慢慢看。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部