如何在不使用 wxDataViewModel 的情况下存储键/值对 wxDataViewListCtrl

How to store Key / Value Pair wxDataViewListCtrl without using wxDataViewModel

我在数据库中有以下示例数据


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

使用上面显示的示例 link,使用 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))

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

然后使用GetItemData()检索id。

使用 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->InsertItem(something, (wxUIntPtr)new std::string("Hey, additional string")会导致内存泄漏。