【问题标题】:How to store Key / Value Pair wxDataViewListCtrl without using wxDataViewModel如何在不使用 wxDataViewModel 的情况下存储键/值对 wxDataViewListCtrl
【发布时间】:2021-12-29 09:13:26
【问题描述】:

我在数据库中有以下可用的示例数据


SrNo |字符串

1 |数据1

2 |数据2

3 |数据3

4 |数据2

5 |数据1

字符串列值可以重复。用户也可以使用 wxSearchCtrl 过滤 wxDataViewListCtrl 中显示的数据,因此 wxDataViewListCtrl 中显示的 ID 号可能会根据用户使用的过滤器而改变。

https://docs.wxwidgets.org/3.0/classwx_data_view_list_ctrl.html

使用上面链接中显示的示例,使用 while 循环将数据库中的数据插入 listctrl。示例代码如下。

wxDataViewListCtrl *listctrl = new wxDataViewListCtrl( parent, wxID_ANY );
listctrl->AppendTextColumn( "String Data" );
wxVector<wxVariant> data;
data.push_back( wxVariant("Data1") );
listctrl->AppendItem( data );
data.clear();
data.push_back( wxVariant("Data2") );
listctrl->AppendItem( data );

如何获取选定行的 SrNo?在下面的代码中?我需要使用 wxDataViewModel 吗?我没有找到任何相同的例子

if(listctrl->GetSelectedRow() != wxNOT_FOUND){
        wxLogMessage("Select Item Id: %i -",listctrl->RowToItem(listctrl->GetSelectedRow()).GetID() );
    }else{
        wxMessageBox("Please Select row", strappName,wxICON_INFORMATION|wxCLOSE); 
    }

尝试了下面的示例代码,但它因分段错误而崩溃。寻找示例代码

listctrl->SetItemData(wxDataViewItem (reinterpret_cast<void *>(iRowCount)),std::stoi(SrNo))

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    使用AppendItem/InsertItem 等中的“wxUIntPtr”参数来存储您的内部索引。

    wxVector<wxVariant> data;
    data.push_back( wxVariant("Data1") );
    listctrl->AppendItem( data, wxUIntPtr(1) );  // <<HERE, your index 1>>
    data.clear();
    data.push_back( wxVariant("Data2") );
    listctrl->AppendItem( data, wxUIntPtr(2) );  // <<and HERE, your index 2>>
    

    然后使用 RowToItem(int row) 为您的行获取 wxDataViewItem 并使用 GetItemData 获取 wxUIntPtr 并将其转换回您的 id。例如

    // Get the wxDataViewItem for "GetSelectedRow" (Warning, not tested for wxID_NOTFOUND)
    auto idx=listctrl->RowToItem(GetSelectedRow());
    
    // Now get the item data, which was added as 2nd parameter for Append/InsertItem
    auto your_index_asUIntPtr=listctrl->GetItemData(idx);
    
    // and in your case convert it back to an int
    int your_index_as_it=(int)your_index_asUIntPtr;
    

    这应该是诀窍。

    一般来说,大多数 wxWidgets 列表函数都有一个额外的void*wxUIntPtr,您可以使用它们将自己的数据添加到列表中的特定条目。您必须将此参数转换为您自己的原始数据类型(int、long 等...)。或者你可以使用这个指针指向一个实际的复杂数据类型(仍然需要指针转换),但列表控件永远不会获得指针的所有权。

    所以像listctrl-&gt;InsertItem(something, (wxUIntPtr)new std::string("Hey, additional string") 这样的事情会导致内存泄漏。

    【讨论】:

    • 非常感谢您提供的示例和解释。这确实有助于理解我们为什么要这样做。它工作得很好。真的很有帮助!
    【解决方案2】:

    您可以使用SetItemData() 或将所有参数传递给AppendItem()

    然后使用GetItemData()获取id。

    【讨论】:

    • 感谢您的回答。如果可能的话,你能给出示例代码吗?我不想向最终用户显示 SrNo。仅显示值(字符串)。
    • @AmodGokhale,非常简单。你不必展示它。只需调用引用的函数,然后检索 ID。我不在机器ATM,但代码会很简单
    • 我试过这样的东西 -listctrl->SetItemData(wxDataViewItem (reinterpret_cast(iRowCount)),std::stoi(SrNo));仍然无法弄清楚..如果您可以添加真正有用的示例代码...
    猜你喜欢
    • 2022-09-24
    • 2013-07-21
    • 1970-01-01
    • 2013-12-14
    • 2019-08-15
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多