微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对ListView组进行排序?

在ListView中,项目按组“BGroup”,“CGroup”和“DGroup”(这些是组头)分组.现在,当我向ListView添加一个新项目并为该项目分配一个标题为“AGroup”的新组时,组“AGroup”总是插在组的末尾;所以新的组顺序是:BGroup,CGroup,DGroup,AGroup.那么如何才能按正确的字母顺序对组进行排序?顺序应为:AGroup,BGroup,DGroup.

解决方法

你可以使用 ListView_SortGroups宏,例如这个宏希望你有自己的比较函数,由 LVGroupCompare函数原型定义.在下面的代码中,组使用 CompareText函数Header属性排序,但现在您可以构建自己的比较.

忘记注意;无论你传递给ListView_SortGroups宏的最后一个Pointer类型参数,你将在pvData参数的LVGroupCompare函数中收到,因此这将是某个列表视图的组排序函数,最好直接传递Groups该列表视图的集合,以便于操作.

由于没有按组ID查找列表视图组的直接方法,因此我将对TListGroups类使用以下帮助函数

type
  TListGroups = class(ComCtrls.TListGroups)
  public
    function FindItemByGroupID(GroupID: Integer): TListGroup;
  end;

implementation

function TListGroups.FindItemByGroupID(GroupID: Integer): TListGroup;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
  begin
    Result := Items[I];
    if Result.GroupID = GroupID then 
      Exit;
  end;
  Result := nil;
end;

然后你可以用这种方式在LVGroupCompare函数回调中使用这个helper方法

function LVGroupCompare(Group1_ID,Group2_ID: Integer;
  pvData: Pointer): Integer; stdcall;
var
  Item1: TListGroup;
  Item2: TListGroup;
  Groups: TListGroups;
begin
  Result := 0;
  Groups := TListGroups(pvData);
  Item1 := Groups.FindItemByGroupID(Group1_ID);
  Item2 := Groups.FindItemByGroupID(Group2_ID);
  if Assigned(Item1) and Assigned(Item2) then
    Result := CompareText(Item1.Header,Item2.Header);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Item: TListItem;
  Group: TListGroup;
begin
  Group := ListView1.Groups.Add;
  Group.Header := 'AGroup';

  Item := ListView1.Items.Add;
  Item.Caption := 'Item X';
  Item.GroupID := Group.ID;

  ListView_SortGroups(ListView1.Handle,LVGroupCompare,ListView1.Groups);
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐