-
December 25th, 2020, 05:25 PM
#31
Re: ListCtrl in MFC
Originally Posted by GCDEF
As to the virtual list control, it's been a while for me, but I remember that as being a way to speed up performance of a list control with a lot of data. I'm not seeing how it helps with the OP's problem.
It's the next evolution of using the list control
1) The first is just copying the data into the control
2) The next is getitemdataptr/setitemdataptr (items are still copied into the control, but a pointer is maintained to point back to the list item)
3) The 3rd is a virtual list control where no data is copied into the control - instead there is a callback to retrieve the data directly from a list.
I'm actually not trying to answer the OP's problem directly (I think that's been done). I'm trying to show essentially that there is more out there. Virtual list controls are kind of like the binding in modern (meaning, non-MFC or QT frameworks). I found it helpful to have understood virtual controls - it helped me understand data binding later on.
-
December 26th, 2020, 04:32 AM
#32
Re: ListCtrl in MFC
Thanks a lot Arjay, for all the help. Very much appreciated. I'll try this today
-
December 26th, 2020, 04:35 AM
#33
Re: ListCtrl in MFC
@GCDEF: May be I didnot code properly.
What i understood is:, SetItemData can hold a reference to the index into the list control and a number. The number can be used later to deduce the first column info.
Is this understanding correct ? Could you comment when you have bit spare time please
Code:
int nItem = priya_list.InsertColumn(0, _T("Cell"), LVCFMT_LEFT, -1, 0);
priya_list.InsertColumn(1, _T("Site"), LVCFMT_LEFT, -1, 0);
int centralsite;
vector<int> sites;
bool bIsfirstCentralsite(false);
for (const auto pair : m)
{
bIsfirstCentralsite = true;
string centreId;
int index = pair.first;
if (index == 1)
{
centreId = "first";
}
else
{
centreId = "second";
}
CString ccetre(centreId.c_str());
for (const auto site : pair.second)
{
int nItem(0);
if (bIsfirstCentralsite)
nItem = priya_list.InsertItem(priya_list.GetItemCount(), ccetre);
else
nItem = priya_list.InsertItem(priya_list.GetItemCount(), _T(""));
auto itr = n.find(site);
string sSiteId = itr->second;
CString cSiteId(sSiteId.c_str());
priya_list.SetItemText(nItem, 1, cSiteId);
priya_list.SetItemData(nItem, (DWORD)(index));
bIsfirstCentralsite = false;
}
}
And to retrieve this :
Code:
void CMFCApplication2Dlg::OnBnClickedAddToSiteDB()
{
CListCtrl * priya_ctrl = (CListCtrl *) GetDlgItem(IDC_LIST1);
POSITION pos = priya_ctrl->GetFirstSelectedItemPosition();
int nItem = priya_ctrl->GetNextSelectedItem(pos);
int centreid = (int)priya_ctrl->GetItemData(nItem);
}
Last edited by pdk5; December 27th, 2020 at 05:05 AM.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|