You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.1 VCL:如何通过代码展开/折叠ListView组?

Delphi 10.1 VCL ListView:展开/折叠全部或特定组的实现方法

嘿,我刚好在Delphi 10.1的VCL项目里处理过ListView组的展开折叠需求,给你整理了两种场景的实用实现方法,直接就能用:

一、展开/折叠特定单个组

Delphi 10.1的VCL已经把ListView组的展开状态封装成了直接可用的属性,操作起来非常简单:

假设你的ListView控件名为ListView1,要操作指定索引的组(索引从0开始),直接修改Expanded属性即可:

// 展开索引为0的组
ListView1.Groups.Items[0].Expanded := True;

// 折叠索引为0的组
ListView1.Groups.Items[0].Expanded := False;

如果因为某些特殊场景需要用Windows API来操作(比如自定义组状态),也可以用下面的方式:

var
  GroupInfo: TLVGroup;
begin
  FillChar(GroupInfo, SizeOf(TLVGroup), 0);
  GroupInfo.cbSize := SizeOf(TLVGroup);
  GroupInfo.mask := LVGF_STATE;
  
  // 展开组:设置LVGS_EXPANDED标志
  GroupInfo.state := LVGS_EXPANDED;
  // 若要折叠,把state设为0即可
  // GroupInfo.state := 0;
  
  // 第一个参数是组的索引,这里操作索引0的组
  SendMessage(ListView1.Handle, LVM_SETGROUPINFO, 0, LPARAM(@GroupInfo));
end;

二、批量展开/折叠全部组

如果需要一次性操作所有组,只需要遍历ListView的Groups集合,逐个设置Expanded属性就行。我给你封装了两个通用的工具函数,方便直接调用:

// 展开ListView的所有组
procedure ExpandAllListViewGroups(AListView: TListView);
var
  I: Integer;
begin
  // 先判断是否有组,避免空集合遍历报错
  if AListView.Groups.Count = 0 then Exit;
  
  for I := 0 to AListView.Groups.Count - 1 do
    AListView.Groups.Items[I].Expanded := True;
end;

// 折叠ListView的所有组
procedure CollapseAllListViewGroups(AListView: TListView);
var
  I: Integer;
begin
  if AListView.Groups.Count = 0 then Exit;
  
  for I := 0 to AListView.Groups.Count - 1 do
    AListView.Groups.Items[I].Expanded := False;
end;

调用的时候直接传入你的ListView控件就行:

// 展开全部组
ExpandAllListViewGroups(ListView1);

// 折叠全部组
CollapseAllListViewGroups(ListView1);

几个注意点

  • 确保你的ListView已经开启分组功能:ViewStyle要设置为vsReport,并且已经正确添加了组和对应的列表项
  • 动态创建组之后,要确保Groups集合已经初始化完成再调用这些方法,避免出现索引越界的错误
  • 10.1版本的VCL封装已经很完善了,优先使用Expanded属性的方式,API方法只在特殊场景下使用

内容的提问来源于stack exchange,提问作者Reron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:32:01