我正在努力寻找关于一些小问题的信息,这些问题是我最近将ObjectListView集成到我的应用程序中遇到的。我必须承认,我喜欢这个控件,因为它几乎可以做我需要的所有工作,从而节省了很多工作量。
然而,在我遇到的一些问题中,其中一个问题是,如果我关闭单个列的分组,它就不再允许我对这些列进行排序。
例如,我的ListView控件有一个ID、摘要、位置等等。我当前在ID上运行分组,因为我针对每个ID附加一个唯一的页脚,并且看起来很好。但是,当我点击摘要或位置时,它会按摘要或位置对所有项目进行分组,因此我最终得到的是组标题,但没有页脚,因为页脚不再与ID相对应。
我想实现的是允许用户单击任何其他列,但仍保持按ID分组,从而保留每个项目的页脚。我只想对项目进行排序,而不是分组,但是如上所述,当我关闭每个列的分组时,它会关闭排序功能。
更新
基本上,看下面的截图,我想能够单击优先级列标题(例如)来按优先级对对象列表进行排序,但仍保持按票(带有组页脚详细信息)分组。基本上,我想能够单击任何列标题来对列表进行排序,但保持按票分组。
我拦截了OLV_BeforeCreatingGroups事件以添加:
e.Parameters.GroupByColumn = Ticket_ID
现在,无论我点击哪个列标题,它似乎仍然按照我的票号分组,但我现在丢失了排序功能。
AlwaysGroupBySortOrder
设置为什么了吗?它的意思是:“如果AlwaysGroupByColumn
不为空,则使用此属性来决定如何对这些组进行排序。如果此属性的值为SortOrder.None
,则排序顺序将根据用户最后一次标题单击而切换。”所以你可能应该将AlwaysGroupByColumn
设置为Ticket_ID
,并将AlwaysGroupBySortOrder
设置为SortOrder.None
? - RevAlwaysGroupByColumn
可以让我在每次单击列标题时保留分组页脚,但它会从控件中删除所有排序功能。单击列标题(第一次单击不起作用,需要单击两次)似乎只是反转列表的顺序,而不是实际排序。 - RiplesObjectListView_FormatCell
事件来覆盖每个项目的单元格绘制。我在e.ColumnIndex
上运行了一个select语句来确定我想要覆盖的列,然后在e.SubItem.Text
上运行了另一个select语句来获取单元格文本。然后,我只需使用e.SubItem.BackColor
和e.SubItem.ForeColor
根据单元格文本更改每个单元格的外观即可。确保为控件打开了UseCellFormatEvents
和OwnerDraw
。希望这可以帮助你,如果不行,也许可以联系我,我可以尝试帮助你进一步。 - Riples