2010-11-10 60 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)。