如何在不使用 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")
会导致内存泄漏。
我在数据库中有以下示例数据
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")
会导致内存泄漏。