Solved

Virtual ListView!!!

Posted on 2000-05-04
4
403 Views
Last Modified: 2013-11-20
Hi,

As I am using VC++5.0 to develop my application, I need to display a lot of data (probably > 50000 items). Thus I choose to use Virtual Listview!!!

Now I face the following two problems!!!

1.) How get I get the text from the virtual listview?
     I found GetItemText() cannot return the text from the listview.

2.) How can I do the sorting the each column?

Thanks!!!
0
Comment
Question by:hon67
  • 2
4 Comments
 
LVL 8

Expert Comment

by:VinExpert
ID: 2779878
Hi,

>1.) How get I get the text from the virtual listview?
                          I found GetItemText() cannot return the text from the listview.

Just try one thing, After U calling the InsertItem(...) call SetItemText(...), I think this problem will be solved. If some paiting problems come, then just use Invalidate().

For sorting u have to write a compare function and sort. U will get lot of samples in the codeguru.developer.com listview section.

Try it out.

All the best
VinExpert
0
 
LVL 1

Accepted Solution

by:
ch_vasu earned 150 total points
ID: 2780054
There is a document in MSDN for Handling the Virtual Listviews.
Map this

1.

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
   //{{AFX_MSG_MAP(CMyListCtrl)
   ON_NOTIFY(LVN_GETDISPINFO,IDC_LIST1, OnGetdispinfo)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Insert the items in OnInitialUpdate/OninitDialog

Then
Update the Values using this method
 
void CAboutDlg::OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
      LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
      
      LV_ITEM* pItem= &(pDispInfo)->item;
      
      int iItemIndx= pItem->iItem;
      
      if (pItem->mask & LVIF_TEXT) //valid text buffer?
      {
            switch(pItem->iSubItem)
            {
        case 0: //fill in main text
            lstrcpy(pItem->pszText,
                "Hello1");
            break;
        case 1: //fill in sub item 1 text
            lstrcpy(pItem->pszText,
                "Hello2");
            break;
        case 2: //fill in sub item 2 text
            lstrcpy(pItem->pszText,
                "Hello3");
            break;
            }
      }
      
      CString strTemp = m_cListCtrl.GetItemText(iItemIndx,0);
      AfxMessageBox(strTemp);

      *pResult = 0;
}

For geting the Text you can use function below.
      CString strTemp =
m_cListCtrl.GetItemText(iItemIndx,0);
2) Sorting
For sorting use this CallBack Function
// Sort the item in reverse alphabetical order.

static int CALLBACK
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
   // lParamSort contains a pointer to the list view control.
   // The lParam of an item is just its index.
   CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
   CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
   CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);

   return strcmp(strItem2, strItem1);
}

void snip_CListCtrl_SortItems()
{
   // The pointer to my list view control.
   extern CListCtrl* pmyListCtrl;

   // Sort the list view items using my callback procedure.
   pmyListCtrl->SortItems(MyCompareProc, (LPARAM) pmyListCtrl);
}





0
 

Author Comment

by:hon67
ID: 2781452
Hello ch_vasu,

Previously, I am not using Virtual Listview to display the data, I insert data and do the sorting of the listview like this:

--------------------------------------------------------
struct info
 {
     CString col1;
     CString clo2;
    CString col3;
};

 LV_ITEM lvi;
 lvi.mask = LVIF_TEXT | LVIF_PARAM;

 for(i = 0; i < nItems; i++)   // nItems = no of rows
{
      lvi.iItem = i;
      lvi.pszText = "Some thing";  //col 0 text
      struct info* pInfo = new struct info;
      pInfo->col0 = "Col1";
      pInfo->col1 = "Col2";
      pInfo->col2 = "Col3";

      lvi.lParam = (DWORD)pInfo;
      m_list1.InsertItem(lvi);
      m_lst1.SetItemText(nItems,1,"Col2");
      m_lst1.SetItemText(nItems,2,"Col3");
     
}

// sort the listview like this

pmyListCtrl->SortItems(MyCompareProc, (LPARAM) nColumnClicked);
------------------------------------------------------

Then I also do the sorting by using the callback function, but I do the comparsion by using the
structure pInfo instead of using the GetItemText function.

Now If I am using Virtual Listview, I found I don't need to use the InsertItem function and fill in the
LV_ITEM Structure.

I want to know whether I still can use this method to do the sorting.

Further, according to your suggested method?
What is the time need to sorting for about 50000 rows with 10 cols? I afraid the time use to call the function GetItemText is very time consuming?                  

0
 
LVL 1

Expert Comment

by:ch_vasu
ID: 2788091

You will get more information about how to RetrieveItem from Virtual list control in MSDN help.
1. To get the Help type 'List View Updates in Internet Explorer' in the MSDN index. There click on heperlink 'Virtual List View'. You can change use that sample code to continue.  

Note :- The section "Compatibility issues: styles, states, and messages" in MSDN says --

List View Control Styles: All four of the list view styles (icon, small icon, list, and report view) support the LVS_OWNERDATA style. However, this style will not work with the LVS_SORTASCENDING or LVS_SORTDESCENDING style.

I believe by using Cache Management you can reduce the sort time.

Try this
All the Best.
-Vasudev

0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

Replication has always been one of those technologies that people run scared from. The main reason is usually cost. When you think of replication, your mind drifts to solutions that replicate from one disk frame to another using block level technolo…
How to fix error ""Failed to validate the vCentre certificate. Either install or verify the certificate by using the vSphere Data Protection Configuration utility" when you are trying to connect to VDP instance from Vcenter.
This tutorial will walk an individual through locating and launching the BEUtility application to properly change the service account username and\or password in situation where it may be necessary or where the password has been inadvertently change…
This tutorial will show how to configure a new Backup Exec 2012 server and move an existing database to that server with the use of the BEUtility. Install Backup Exec 2012 on the new server and apply all of the latest hotfixes and service packs. The…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now