不使用SetItemData按字母顺序对wxListCtrl进行排序

时间:2014-11-04 04:30:07

标签: c++ wxwidgets

我已经实现了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()

1 个答案:

答案 0 :(得分:0)

如果您想依靠控件进行排序(而不是在内部使用项目,只需按正确的顺序将它们重新插入),您必须能够访问排序键(即您的案例中的文本) )通过项目数据。因此,不要只将自己的数据与每个项目相关联,而是将包含项目文本和自定义数据的结构与之关联起来。

或者,使用wxLC_VIRTUAL并覆盖OnGetItemXXX()以正确的顺序返回商品。这有时可能比处理手动排序项目更简单,对于任何非平凡数量的项目来说肯定更有效。