在动态集中使用虚拟CListView2010-06-04这个例子举例说明了如何与IE4的虚列表视一起使用一个Access数据库文件。加载大量数据到CListView派生类是一个非常慢的过程,甚至当数据在内存是也是如此。在数据库中存取数据时就更慢了。一个列表视的新的特点是当它需要数据是再加载的能力。下面是具体步骤。你必须安装IE3以后版本的COMCTL32.DLL。打开你的数据库文件。使用你的文档对象打开你的文件和记录集。在该例子中,我用了一个动态集类型的记录集。这样就允许我使用CDaoRecordSet的SetAbsolutePosition成员函数设置一个记录集对象的当前记录相对记录号。BOOL CVirtualListDoc::OnOpenDocumentFile(LPCTSTR lpszPathname) { CString m_FileName = lpszPathname; pDBase = new CDaoDatabase; pDBase->Open(m_FileName); CString strSQL = "SELECT * FROM TableName ORDER BY ColumnName";//Set up SQL statement pRecordSet = new CDaoRecordset(pDBase); pRecordSet->Open(dbOpenDynaset, strSQL);//Open recordset using SQL statement pRecordSet->MoveLast();//you have to access the records in the dynaset to get GCDaoRecordSet::etRecordCount() to work }设置该列表视的风格为LVS_OWNERDATA;BOOL CVirtualListView::PreCreateWindow(CREATESTRUCT& cs) { cs.lpszName = WC_LISTVIEW; cs.style &= ~LVS_TYPEMASK; cs.style |= LVS_REPORT; cs.style |= LVS_EDITLABELS; cs.style |= LVS_OWNERDATA; CListView::PreCreateWindow(cs); }在列表中设置项的个数。你需要告诉列表视将包括多少项。这通过发送一个LVN_SETITEMCOUNT到该列表控制。在列表视的OnInitialUpdate()成员函数中来完成上述工作,并且设置列表视的列数。你能够发送一个LVM_SETEXTENDLISTVIEWSTYLE消息给该控件来设置一些新的扩展的列表视风格。void CVirtualListView::OnInitialUpdate() { CListView::OnInitialUpdate(); /*set number of items in list to number of items in RecordSet*/ /* create image list*/ imageList.Create(IDB_IMAGELIST, 16, 1, RGB(0,0,0)); GetListCtrl().SetImageList(&imageList, LVSIL_SMALL); /* set extended stlyes*/ DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | /*LVS_EX_SUBITEMIMAGES |*/ LVS_EX_HEADERDRAGDROP | LVS_EX_TRACKSELECT; GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle)); LV_COLUMN lvColumn; lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvColumn.fmt = LVCFMT_LEFT; lvColumn.cx = 120; for(int i = 0; i < GetFieldCount(); i++) // set up columns { CDaoFieldInfo fieldinfo; pRecordSet->GetFieldInfo(i, fieldinfo);//get field name int len = fieldinfo.m_strName.GetLength(); CString temp = fieldinfo.m_strName; TCHAR* szBuffer = new TCHAR[len + 1]; strcpy(szBuffer, temp.GetBuffer(len)); temp.ReleaseBuffer(); lvColumn.pszText = szBuffer; GetListCtrl().InsertColumn(i, &lvColumn);//insert column delete szBuffer; } /*set number of items in ListView*/ count = pRecordSet->GetRecordCount();//Get number of records GetListCtrl().SendMessage(LVM_SETITEMCOUNT, (WPARAM)count, (LPARAM)LVSICF_NOINVALIDATEALL); }