【问题标题】:How to move an item up and down in a wxListCtrl (wxwidgets)如何在 wxListCtrl 中上下移动项目(wxwidgets)
【发布时间】:2010-11-10 20:14:59
【问题描述】:

这应该很容易,但我做这件事很费时间。基本上我想在我的 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。

【问题讨论】:

    标签: c++ windows wxwidgets


    【解决方案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 内部的实际内容。

    希望这仍然可以帮助任何人!

    【讨论】:

      【解决方案2】:

      即使已经检查了一个答案。我在这里有同样的问题,但我的列表是无序的。通过查看 wxWidgets 的代码,我发现 wxListItem 对象内部还有另一个重要信息 - the mask。通过将掩码值设置为 -1,我的重新排序工作正常,这意味着所有数据都应被复制。这包括项目文本以及其他信息,例如项目数据(这对我来说很重要)。

      wxListItem item;
      item.SetId(item_id);         // set needed id
      item.SetMask(-1);            // set needed data
      m_list->GetItem(item);       // actually retrieve the item
      m_list->DeleteItem(item_id); // remove old copy
      item.SetId(item_id - 1);     // move item up
      m_list->InsertItem(item);    // insert copy of item
      

      我还必须使用“InsertItem”而不是“SetItem”。否则,不会插入新项目,而是覆盖现有项目(另请参阅tomcat31's answer)。

      【讨论】:

        【解决方案3】:

        列表是否有序?如果是自动订购,它可能会忽略您尝试申请的订单。

        回想起来,内部顺序不一定是连续的,您可能必须获取前一项的索引并在它之前执行一项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多