2010-11-10 56 views
2

這應該很簡單,但我有一段時間做這件事。基本上我想在我的wxListCtrl中上下移動一行。我發佈了這個wxwidgets論壇,並得到了以下代碼。如何在wxListCtrl中上下移動項目(wxwidgets)

m_list->Freeze(); 
wxListItem item; 
item.SetId(item_id); // the one which is selected 
m_list->GetItem(item); // Retrieve the item 
m_list->DeleteItem(item_id); // Remove it 
item.SetId(item_id - 1); // Move it up 
m_list->SetItem(item); // Apply it's new pos in the list 
m_list->Thaw(); 

哪個不起作用。該元素被刪除但不能移動(我猜setitem行不工作)。然後,我想只是切換文本和圖像,但我甚至無法可靠地從行中獲取文本。我有

int index = m_right->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 
wxString label = m_right->GetItemText(index); 

if(index == 0) 
    return; 

wxListItem item; 
item.SetId(index); 
bool success = m_right->GetItem(item); 
wxString text = item.GetText(); 

但即使有文本且索引正確,文本仍是空白。所以,我甚至不能完成最基本的任務。任何人都知道如何做到這一點?代碼在按鈕回調中運行(用戶按下一個向上箭頭,我的代碼執行以嘗試移動它)。我在Windows上使用2.9.1。

+0

它是否在2.8.x? – genpfault 2010-11-10 20:23:03

回答

0

該清單是否已訂購?如果它是自動訂購,它可能會忽略您嘗試應用的訂單。

從回憶的內部順序不一定順序,你可能需要獲得前一個項目的索引,去一個之前。

1

我做了這樣的工作,wxWidgets的2.9.3:

void FileSelectionPanel::OnMoveUp(wxCommandEvent& WXUNUSED(evt)) 
{ 
    int idx = _listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 
    if(idx == 0) idx = _listCtrl->GetNextItem(0, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 

    _listCtrl->Freeze(); 
    while(idx > -1) {  
     wxListItem item; 
     item.SetId(idx); _listCtrl->GetItem(item); 
     item.SetId(idx-1); _listCtrl->InsertItem(item); 

     _listCtrl->SetItemData(idx-1, _listCtrl->GetItemData(idx+1)); 
     for(int i = 0; i < _listCtrl->GetColumnCount(); i++) { 
      _listCtrl->SetItem(idx-1, i, _listCtrl->GetItemText(idx+1, i)); 
     } 
     _listCtrl->DeleteItem(idx + 1); 
     idx = _listCtrl->GetNextItem(idx-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 
    } 
    _listCtrl->Thaw(); 
} 

我注意到它是wxListItem更便利的結構,用於存儲視圖和幫助傳遞值的狀態改變成wxListCtrl事情「很好」。它絕不會綁定到wxListCtrl的實際內部。

希望這仍然有助於任何人!

1

即使已經有一個被檢查的答案。我在這裏有同樣的問題,但我的列表是無序的。通過查看wxWidgets的代碼,我發現wxListItem對象中有另一個重要的信息 - the mask。通過將掩碼值設置爲-1,我得到了重新排序以正確工作,這意味着所有數據都應該被複制。這包括項目文本以及其他信息,如項目數據(這對我來說很重要)。我也不得不使用「InsertItem」而不是「SetItem」。否則,不會插入新項目,而會覆蓋現有項目(另請參閱tomcat31's answer)。