我正在使用带有TImageList的TTreeView。我的Treeview表示类似于Windows Treeview,其中我有Group节点和Item节点。
创建组节点时,它们具有2个图像列表中设置的图像索引,一个用于关闭文件夹(imgGroupClosed)图标,第二个用于打开文件夹(imgGroupOpen)图标。
当我添加其他类型的节点时,它们会使用也从图像列表中设置的不同图标。
现在我的问题是,如何确保组节点显示正确的图标?例如,如果我删除或移动子项目节点,则不再有任何子项的组应显示为已关闭但显示为已打开。
我尝试编写一个可重用的程序,如下所示:
procedure TfrmMain.UpdateGroupImages;
var
Node: TTreeNode;
i: Integer;
begin
if TreeView1.Items.Count > 0 then
begin
for i := 0 to TreeView1.Items.Count - 1 do
begin
Node := TreeView1.Items[i];
case Node.ImageIndex of
imgGroupClosed, imgGroupOpen:
begin
if Node.HasChildren then
begin
if Node.Expanded then
begin
Node.ImageIndex := imgGroupOpen;
Node.SelectedIndex := imgGroupOpen;
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end;
end;
end;
end;
end;
end;
我一直在一些Treeview事件中调用它,例如OnCollapsed,OnExpanded,OnDeletion,OnDragDrop等,但它似乎没有正常工作。
有没有更好的方法,或者有人可以帮助更新/修复上面的代码?
基本上我遇到的问题是组节点没有正确更新图像,所以有时候我没有孩子或没有扩展等时会留下一个打开的文件夹图标。
谢谢,克雷格。
答案 0 :(得分:0)
按如下方式添加BeginUpdate和EndUpdate,它应该可以工作:
procedure TfrmMain.UpdateGroupImages;
var
Node: TTreeNode;
i: Integer;
begin
TreeView1.BeginUpdate;
try
if TreeView1.Items.Count > 0 then
begin
for i := 0 to TreeView1.Items.Count - 1 do
begin
Node := TreeView1.Items[i];
case Node.ImageIndex of
imgGroupClosed, imgGroupOpen:
begin
if Node.HasChildren then
begin
if Node.Expanded then
begin
Node.ImageIndex := imgGroupOpen;
Node.SelectedIndex := imgGroupOpen;
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end;
end;
end;
end;
end;
finally
TreeView1.EndUpdate;
end;
end;