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
相关产品推荐
相关产品推荐

