我已经实现了wxListCtrl
,并希望按字母顺序对列表进行排序。虽然这听起来与问题here类似,但它有一个主要区别:我使用SetItemData()
和GetItemData()
来存储向量的索引。
提供的代码here效果很好,但需要GetItemData()
。即使比较函数没有引用任何项目数据,如果省略它,排序也不完整。
static int wxCALLBACK MyCompareFunction(long item1, long item2, long sortData) {
wxSortedListCtrl *ctrl = (wxSortedListCtrl*) sortData;
wxString a, b;
a = ctrl->GetItemText(item1, ctrl->GetSortedColumn());
b = ctrl->GetItemText(item2, ctrl->GetSortedColumn());
if( ctrl->IsSortedAscending() )
return a.CmpNoCase(b);
return b.CmpNoCase(a);
}
bool wxSortedListCtrl::SortItems(void) {
long item = -1;
for ( ;; ) {
item = GetNextItem(item);
if ( item == -1 )
break;
SetItemData(item, item);
//this is needed even though MyCompareFunction doesn't use it AT ALL.
//however it overwrites the data that I use myself...
}
return wxListCtrl::SortItems(MyCompareFunction, (long)this);
}
如何在保留项目数据的同时使用此排序功能我已将自己设置为SetItemData()
?
答案 0 :(得分:0)
如果您想依靠控件进行排序(而不是在内部使用项目,只需按正确的顺序将它们重新插入),您必须能够访问排序键(即您的案例中的文本) )通过项目数据。因此,不要只将自己的数据与每个项目相关联,而是将包含项目文本和自定义数据的结构与之关联起来。
或者,使用wxLC_VIRTUAL
并覆盖OnGetItemXXX()
以正确的顺序返回商品。这有时可能比处理手动排序项目更简单,对于任何非平凡数量的项目来说肯定更有效。