如何在ObjectListView中对对象进行分组和排序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我正在尝试将我的对象列表分组ObjectListView

ObjectListView应组基于第一列,但随后的对象具有相同的列排序基于自定义排序。

我怎么做?我已阅读以下文档ObjectListViewhttp//objectlistview.sourceforge.net/cs/gettingStarted.html#gettingstarted

到目前为止,我已经实现了自定义排序,但我不确定如何触发分组?请记住,我正在尝试对第一列进行分组,但随后应用自定义排序。

我的自定义排序取决于BeforeSorting事件:

// after initializing components
olv.BeforeSorting += olv_BeforeSorting;

然后...

private void olv_BeforeSorting(object sender,BrightIdeasSoftware.BeforeSortingEventArgs e)
{
        olvDataSource.Sort((x, y) => x.Group.ID.CompareTo(y.Group.ID));
        e.Handled = true;
}

ObjectListView显示我的有序对象列表,但它没有组合在一起。每个对象显示在其自己的行上,没有组标题。

排序后如何对对象进行分组?

提问于
用户回答回答于

我正在为可能遇到的任何人分享这个问题,寻找一种方法来对一个组内的组应用自定义排序ObjectListView

可能有更好的方法来做到这一点,但这种方式对我有用。

colFirst.GroupFormatter = (BrightIdeasSoftware.OLVGroup group, BrightIdeasSoftware.GroupingParameters parms) =>
{
    ObjectA a = (OjectA)group.Key;

/* Add any processing code that you need */

group.Task = " . . . ";
    group.Header = "Special Name: " + a.Name;
    group.Subtitle = $("Object A: {a.Index}, Total Water Consumption: {a.WaterConsumption}");

// This is what is going to be used as a comparable in the GroupComparer below
group.Id = a.ID;

// This will create the iComparer that is needed to create the custom sorting of the groups
    parms.GroupComparer = Comparer<BrightIdeasSoftware.OLVGroup>.Create((x, y) => (x.GroupId.CompareTo(y.GroupId)));
};

这里OLVColumn.GroupFormatter有轻微的解释:http//objectlistview.sourceforge.net/cs/recipes.html#how-do-i-put-an-image-next-to-a-group-heading

用户回答回答于

您可以按如下方式强制分组列:

olv.ShowGroups = true;
olv.AlwaysGroupByColumn = olvColumn1;

如果要在列中显示一个值,并使用另一个值进行分组 GroupByKeyGetter

olvColumn1.GroupKeyGetter = GroupKeyGetter;

代表将是这样的:

private object GroupKeyGetter(object rowObject)
{
    var o = rowObject as MyClass;

    if(o == null)
        return "unknown";

    return o.ID;
}

有些东西在你打电话之前不会生效

olv.RebuildColumns();

始终排序(任意功能)

如果要对某些自定义逻辑强制排序,可以ListViewItemSorterBeforeSorting事件中使用。这类似于注册CustomSorter(但是ShowGroups当真实时似乎不起作用)。

olv.BeforeSorting += olv_BeforeSorting;

然后

private void olv_BeforeSorting(object sender, BrightIdeasSoftware.BeforeSortingEventArgs e)
{
    //example sort based on the last letter of the object name
    var s = new OLVColumn();
    s.AspectGetter = (o) => ((MyClass)o).Name.Reverse().First(); 

    this.olv.ListViewItemSorter = new ColumnComparer(
                s, SortOrder.Descending, e.ColumnToSort, e.SortOrder);
    e.Handled = true;
}

扫码关注云+社区

领取腾讯云代金券