c++ - 如何在 wxListCtrl (wxwidgets) 中上下移动一个项目

标签 c++ windows 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。

最佳答案

我用 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/

相关文章:

c++ - 用模板参数填充容器

windows - 如何连接到 Windows 中的其他程序?

c++ - wxWidgets 中的线程

c++ - 根据模板参数可选择为静态的类成员

c++ - 使用 Win32 C++ 访问 protected 网络共享

c++ - 没有窗口的后台进程

检查 VirtualAlloc 是否返回了 VirtualAddress

c++ - 使用 GStreamer 和 wxPanel 播放视频

c++ - 将应用程序部署为静态或动态构建的最佳实践是什么?

c++ - 用于 FL SDK 和 VST 的优秀 C++ GUI 库