参看帖子http://bbs.csdn.net/topics/60131423
可以用一个 TStrings 来维护这个对应关系,在增加一个 Node 的之后,增加一个 Object 到 TStrings,删除一个 Node 之后,在 TStrings 也同时删除那个 Item。做 Clear 的时候,先 TreeView.Items.Clear, 再 Strings.Clear。下面是一个例子(增加、删除节点时根本不用刷新的):
var
FIDList: TStrings;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 创建 TStrings 的对象 FIDList
FIDList := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// 清除对象 FIDList
TreeView1.Items.Clear; // 很重要,不然会出错
FIDList.Destroy;
end;
procedure TForm1.AddNodeClick(Sender: TObject);
var
Node: TTreeNode;
Text: string;
begin
// 实际操作的时候,Text 和 ID 都是从数据库中读出的
Text := 'Text' + IntToStr(TreeView1.Items.Count);
Node := TreeView1.Items.AddChild(nil, Text);
FIDList.AddObject('ID_' + Text, Node);
end;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
// 删除节点时同时删除关联
FIDList.Delete(FIDList.IndexOfObject(Node));
end;
procedure TForm1.DelNodeClick(Sender: TObject);
begin
// 删除节点
if TreeView1.Selected <> nil then
TreeView1.Selected.Delete;
end;
procedure TForm1.GetNodeClick(Sender: TObject);
var
Node: TTreeNode;
begin
// 通过 ID 访问 Node
if FIDList.IndexOf(Edit1.Text) >= 0 then
begin
Node := TTreeNode(FIDList.Objects[FIDList.IndexOf(Edit1.Text)]);
ShowMessage(Node.Text);
end;
end;
procedure TForm1.ShowSelIDClick(Sender: TObject);
begin
// 取得一个节点对应的 ID 值
if TreeView1.Selected <> nil then
ShowMessage(FIDList.Strings[FIDList.IndexOfObject(TreeView1.Selected)]);
end;