2014-11-04 11 views
0

我已經實現了wxListCtrl,並且想按字母順序對列表進行排序。雖然這聽起來與here的問題類似,但它與一個主要區別有所不同:我使用SetItemData()GetItemData()來存儲矢量的索引。按字母順序排序wxListCtrl而不使用SetItemData

提供的代碼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

如果您想要依靠控件進行排序(而不是內部訴諸項目,只是以正確的順序將它們重新插入),則必須能夠訪問排序鍵(即您的文本案例)通過項目數據。因此,不要只將您自己的數據與每個項目相關聯,而是將一些包含項目文本和您的自定義數據的結構與它關聯起來。

或者,也可以使用wxLC_VIRTUAL,然後覆蓋OnGetItemXXX()以正確的順序返回項目。這有時可能比處理手動排序項目更簡單,對於任何不平凡數量的項目肯定更有效。