目标:
Treeview中显示表中员工姓名(已实现),但同时希望能够保存员工id,以便在点击某个节点后可以根据id 显示出此员工相关的值(因为姓名不是主键,怕有重复会出错)。我试了selectedindex/stateindex等属性都不可以保存,请问如何做?
Treeview中显示表中员工姓名(已实现),但同时希望能够保存员工id,以便在点击某个节点后可以根据id 显示出此员工相关的值(因为姓名不是主键,怕有重复会出错)。我试了selectedindex/stateindex等属性都不可以保存,请问如何做?
你的代码贴出来看看!
顺带关注有没有更好的方法!
我刚使用了,很方便:)
我根据帮助的例子这样写的,可还是有问题:
with tvLX do begin
Items.clear;
myNode:=Items.Add(nil, '全体离休人员');
with SalaryDM.qrylxInfo do begin
Open; First;
while not eof do begin
MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
myNode.Data := MyRecPtr; //问题在这里
Next;
end;
end;
end;
可以显示,我F8 也可以跟踪到id指针变量的变化,但所有项的data值都是表末尾的那个id值,请帮我看看。
Connection := DataMod.ado_cnn;
SQL.Add(strSql);
Prepared := True;
//ShowMessage(SQL.Text);
Open;
First;
//第一个小区
New(myPoint);
myPoint.AString := 'borough';
myPoint.AInteger := FieldByName('borough_id').AsInteger;
tnBorough := Atvw.Items.AddObject(nil,FieldByName('borough_name').AsString,myPoint);
MakeImageIndex(tnBorough,nSelectNo,nSelectYes);
//楼宇
New(myPoint);
myPoint.AString := 'building';
myPoint.AInteger := FieldByName('building_id').AsInteger;
tnBuilding := Atvw.Items.AddChildObject(tnBorough,FieldByName('building_name').AsString,myPoint);
MakeImageIndex(tnBuilding,nSelectNo,nSelectYes);
end;我的指针定义是:
type
PWznRec = ^TWznRec;
TWznRec = record
AString : string;
AInteger : Integer;
ABoolean : Boolean;
end;
with tvLX do begin
Items.clear;
myNode:=Items.Add(nil, '全体离休人员');
with SalaryDM.qrylxInfo do begin
Open; First;
while not eof do begin
new(MyRecPtr);/////////每次都要重新申请,否则就会出现所有的指针都指向循环最后一个,因为是同一个指针 。
MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
// myNode.Data := MyRecPtr; //问题在这里 这句不需要
Next;
end;
end;
end;
//////////
TreeView会帮你释放的!
try
new(MyRecPtr);
MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
except
FreeMem(MyRecPtr);
end;
出了异常,手动释放。没出异常,不用管他。
不过就为了保存一个整形值,stateindex足够!