首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ObjectListView中对对象进行分组和排序?

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

Stack Overflow用户
提问于 2019-06-25 06:53:27
回答 3查看 1.1K关注 0票数 0

我正在尝试将我的对象列表分组到一个ObjectListView中。

ObjectListView应该根据第一列对对象进行分组,然后根据自定义排序对同一列进行排序。

我该怎么做?我已经通读了ObjectListView的文档:http://objectlistview.sourceforge.net/cs/gettingStarted.html#gettingstarted

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

我的自定义排序依赖于BeforeSorting事件:

代码语言:javascript
复制
// after initializing components
olv.BeforeSorting += olv_BeforeSorting;

然后..。

代码语言:javascript
复制
private void olv_BeforeSorting(object sender,BrightIdeasSoftware.BeforeSortingEventArgs e)
{
        olvDataSource.Sort((x, y) => x.Group.ID.CompareTo(y.Group.ID));
        e.Handled = true;
}

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-27 08:55:52

我将这篇文章分享给在这里寻找在ObjectListView中的组上应用自定义排序方法的任何人。

也许有更好的方法可以做到这一点,但这种方法对我来说是有效的。

代码语言:javascript
复制
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.GroupFormatterhttp://objectlistview.sourceforge.net/cs/recipes.html#how-do-i-put-an-image-next-to-a-group-heading

票数 1
EN

Stack Overflow用户

发布于 2019-06-25 19:28:45

您可以强制分组列,如下所示:

代码语言:javascript
复制
olv.ShowGroups = true;
olv.AlwaysGroupByColumn = olvColumn1;

如果要在列中显示一个值并按不同的值分组,可以使用GroupByKeyGetter

代码语言:javascript
复制
olvColumn1.GroupKeyGetter = GroupKeyGetter;

委派应该是这样的:

代码语言:javascript
复制
private object GroupKeyGetter(object rowObject)
{
    var o = rowObject as MyClass;

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

    return o.ID;
}

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

代码语言:javascript
复制
olv.RebuildColumns();

排序方式(任意函数)

如果希望对某些自定义逻辑强制排序,可以在BeforeSorting事件中使用ListViewItemSorter。这类似于注册CustomSorter (但当ShowGroups为true时似乎不起作用)。

代码语言:javascript
复制
olv.BeforeSorting += olv_BeforeSorting;

然后

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-04 03:05:07

这是可行的,并且基本上就是这里的食谱http://objectlistview.sourceforge.net/cs/recipes.html?highlight=sort#how-can-i-change-the-ordering-of-groups-or-rows-within-a-group中所描述的。

首先订阅olv BeforeCreatingGroups活动。

然后在事件处理程序中创建自定义排序比较器。在这种情况下,对于匹配“海龟”的组,它将推送到排序的末尾,但很明显,您可以在其中包含任何您想要的复杂逻辑。

代码语言:javascript
复制
private void Olv_BeforeCreatingGroups(object sender, CreateGroupsEventArgs e)
{
    e.Parameters.GroupComparer = Comparer<BrightIdeasSoftware.OLVGroup>.Create(
        (x, y) => (
            x.Header == "Turtles" ? 1
                : x.GroupId.CompareTo(y.GroupId)
        )
    );
}

这是我最初使用的,因为它是食谱中的内容。但我最终切换到了更像Marwan的答案,因为这个答案创建了一个空间来重新配置组标头本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56744886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档