如何在 ObjectListView 中对 Objects 进行分组和排序?
How to Group and Sort Objects in ObjectListView?
我正在尝试将我的 object 列表分组到 ObjectListView
。
ObjectListView
应根据第一列对 object 进行分组,然后根据自定义排序对同一列进行排序。
我该怎么做?我已阅读 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
显示我订购的 object 列表,但它没有组合在一起。每个 object 显示在自己的行中,没有组标题。
如何在排序后对 object 进行分组?
您可以强制分组列如下:
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();
始终排序(任意函数)
如果您想对某些自定义逻辑进行强制排序,您可以在 BeforeSorting
事件中使用 ListViewItemSorter
。这类似于注册 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;
}
我将此信息分享给可能遇到这里寻找一种方法对 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
这是有效的,基本上就是这里的食谱中所描述的http://objectlistview.sourceforge.net/cs/recipes.html?highlight=sort#how-can-i-change-the-ordering-of-groups-or-rows-within-a-group
首先订阅olv BeforeCreatingGroups事件。
然后在事件处理程序中创建自定义排序比较器。在这种情况下,对于匹配“Turtles”的组,它将推到排序的末尾,但显然你可以在那里拥有任何你想要的复杂逻辑。
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 的答案,因为那个创建了一个 space 来重新配置组 headers 自己。
我正在尝试将我的 object 列表分组到 ObjectListView
。
ObjectListView
应根据第一列对 object 进行分组,然后根据自定义排序对同一列进行排序。
我该怎么做?我已阅读 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
显示我订购的 object 列表,但它没有组合在一起。每个 object 显示在自己的行中,没有组标题。
如何在排序后对 object 进行分组?
您可以强制分组列如下:
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();
始终排序(任意函数)
如果您想对某些自定义逻辑进行强制排序,您可以在 BeforeSorting
事件中使用 ListViewItemSorter
。这类似于注册 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;
}
我将此信息分享给可能遇到这里寻找一种方法对 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
这是有效的,基本上就是这里的食谱中所描述的http://objectlistview.sourceforge.net/cs/recipes.html?highlight=sort#how-can-i-change-the-ordering-of-groups-or-rows-within-a-group
首先订阅olv BeforeCreatingGroups事件。
然后在事件处理程序中创建自定义排序比较器。在这种情况下,对于匹配“Turtles”的组,它将推到排序的末尾,但显然你可以在那里拥有任何你想要的复杂逻辑。
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 的答案,因为那个创建了一个 space 来重新配置组 headers 自己。