在ObjectListView中关闭分组会关闭排序

3

我正在努力寻找关于一些小问题的信息,这些问题是我最近将ObjectListView集成到我的应用程序中遇到的。我必须承认,我喜欢这个控件,因为它几乎可以做我需要的所有工作,从而节省了很多工作量。

然而,在我遇到的一些问题中,其中一个问题是,如果我关闭单个列的分组,它就不再允许我对这些列进行排序。

例如,我的ListView控件有一个ID、摘要、位置等等。我当前在ID上运行分组,因为我针对每个ID附加一个唯一的页脚,并且看起来很好。但是,当我点击摘要或位置时,它会按摘要或位置对所有项目进行分组,因此我最终得到的是组标题,但没有页脚,因为页脚不再与ID相对应。

我想实现的是允许用户单击任何其他列,但仍保持按ID分组,从而保留每个项目的页脚。我只想对项目进行排序,而不是分组,但是如上所述,当我关闭每个列的分组时,它会关闭排序功能。

更新

基本上,看下面的截图,我想能够单击优先级列标题(例如)来按优先级对对象列表进行排序,但仍保持按票(带有组页脚详细信息)分组。基本上,我想能够单击任何列标题来对列表进行排序,但保持按票分组。

enter image description here

我拦截了OLV_BeforeCreatingGroups事件以添加:

e.Parameters.GroupByColumn = Ticket_ID

现在,无论我点击哪个列标题,它似乎仍然按照我的票号分组,但我现在丢失了排序功能。


你将AlwaysGroupBySortOrder设置为什么了吗?它的意思是:“如果AlwaysGroupByColumn不为空,则使用此属性来决定如何对这些组进行排序。如果此属性的值为SortOrder.None,则排序顺序将根据用户最后一次标题单击而切换。”所以你可能应该将AlwaysGroupByColumn设置为Ticket_ID,并将AlwaysGroupBySortOrder设置为SortOrder.None - Rev
我已经尝试了那些设置,但好像没有什么帮助。设置 AlwaysGroupByColumn 可以让我在每次单击列标题时保留分组页脚,但它会从控件中删除所有排序功能。单击列标题(第一次单击不起作用,需要单击两次)似乎只是反转列表的顺序,而不是实际排序。 - Riples
@Riples,你能否分享一下你是如何用酷炫的颜色格式化优先级列的?我也想尝试同样的效果。 - malt_man
1
当然,@malt_man。我使用了ObjectListView_FormatCell事件来覆盖每个项目的单元格绘制。我在e.ColumnIndex上运行了一个select语句来确定我想要覆盖的列,然后在e.SubItem.Text上运行了另一个select语句来获取单元格文本。然后,我只需使用e.SubItem.BackColore.SubItem.ForeColor根据单元格文本更改每个单元格的外观即可。确保为控件打开了UseCellFormatEventsOwnerDraw。希望这可以帮助你,如果不行,也许可以联系我,我可以尝试帮助你进一步。 - Riples
1个回答

0

尝试将AlwaysGroupByColumn设置为TicketId列。那样就可以解决问题了 :)

第二次尝试:

感谢您提供的截图。我想我明白您想要什么。您希望单击标题时对组本身进行排序。这不是默认行为,而是对每个组内的行进行排序。

要做到您所要求的:

  1. 监听BeforeCreatingGroups事件,并在事件参数块上填写GroupComparer属性。此比较器控制组的排序。

  2. 默认的组顺序基于OLVGroup.SortValue。因此,您可以安装一个GroupFormatter委托,并更改每个组的SortValue,以便按您想要的方式排序。

无论哪种情况,您都需要使用PrimarySortPrimarySortOrder来知道用户最后单击的列。


嗨Grammarian,谢谢您的回复。我无法找到您建议的AlwaysSortByColumn方法。我只能找到AlwaysGroupByColumn和AlwaysGroupBySortOrder。您能否进一步解释一下您的回复,谢谢。 - Riples
仅提供更多细节 - AlwaysGroupByColumn 可以让我在每个列上保持相同的分组,但是当单击列时它无法正确排序。 - Riples
抱歉,我是指AlwaysGroupByColumn。当设置了AlwaysGroupByColumn时,点击标题将对每个组内的行进行排序。 - Grammarian
您的“组”只包含一行吗?我认为您可能误解了组的作用。组将行收集到一个标题下的“子集合”中。单击列标题可以更改子集合中项目的顺序。 - Grammarian
是的,我确实理解组的工作原理(我想),但我希望 ObjectListView 可以处理类似的情况。你知道我是否可以以其他方式为列表视图中的每个项目创建脚注吗?或者是否可能将这样的功能添加到 ObjectListView 中呢?我喜欢页脚的功能,它确实适合我所要做的功能,但我真的不知道该如何在不失去 ListView 排序功能的情况下绕过它。如果可能的话,我真的不想使用 TreeView。 - Riples
我已经修改了我的应用程序,不再像我最初打算的那样处理组页脚。显然我试图让ListView做一些不受支持的非常规行为,因此我已经放弃了最初的请求,并恢复了控件的正常组处理方式。感谢你花时间评论关于组处理的替代方法。谢谢。 - Riples

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接