正确更新Treeview节点图像?

时间:2011-05-25 10:15:25

标签: delphi treeview

我正在使用带有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等,但它似乎没有正常工作。

有没有更好的方法,或者有人可以帮助更新/修复上面的代码?

基本上我遇到的问题是组节点没有正确更新图像,所以有时候我没有孩子或没有扩展等时会留下一个打开的文件夹图标。

谢谢,克雷格。

1 个答案:

答案 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;