这应该很容易,但我做起来很费时间。基本上我想在我的 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。
最佳答案
我用 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 更像是一个方便的结构,用于存储 View 的状态并帮助将值“很好地”传递到 wxListCtrl 中。它决不会绑定(bind)到 wxListCtrl 中的实际内容。
希望这仍然对任何人有帮助!
关于c++ - 如何在 wxListCtrl (wxwidgets) 中上下移动一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148638/