Как группировать и сортировать объекты в ObjectListView? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь сгруппировать свой список объектов в ObjectListView.

ObjectListView должен группировать объекты на основе первого столбца, но затем сортировать этот же столбец на основе пользовательской сортировки.

Как мне это сделать? Я прочитал документацию для ObjectListView: http://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 отображает мой упорядоченный список объектов, но он не сгруппирован вместе. Каждый объект отображается в отдельной строке без заголовка группы.

Как сгруппировать мои объекты после сортировки?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я делюсь этим для всех, кто может встретиться здесь и ищет способ применения пользовательской сортировки к группам внутри 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

1 голос
/ 25 июня 2019

Вы можете принудительно настроить столбец группировки следующим образом:

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();

Всегда сортировать по (произвольной функции)

Если вы хотите принудительно отсортировать какую-либо пользовательскую логику, вы можете использовать ListViewItemSorter в событии BeforeSorting. Это похоже на регистрацию CustomSorter (но, похоже, не работает, когда ShowGroups имеет значение true).

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;
}
...