我在我们的项目中用了虚拟CListCtrl控件,大致代码如下:
CTestVCListCtrlView::CTestVCListCtrlView()
{
m_lImageList.Create(IDB_BITMAP, 30, 1, RGB(0,0,0));
}BOOL CTestVCListCtrlView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_OWNERDATA;
return CListView::PreCreateWindow(cs);
}void CTestVCListCtrlView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
int nCount=100;
CListCtrl& lscView = GetListCtrl();
lscView.SetImageList(&m_lImageList,LVSIL_SMALL);
DWORD dwExStyle = lscView.GetExtendedStyle();
lscView.SetExtendedStyle(dwExStyle|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT ); 
         //开始初始化列标题
}void CTestVCListCtrlView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
long rowIndex = pDispInfo->item.iItem;
long colIndex = pDispInfo->item.iSubItem;
if(pDispInfo->item.mask & LVIF_TEXT)
{ //与数据库绑定,得到数据库里面的内容
lstrcpyn(pDispInfo->item.pszText, stemp, pDispInfo->item.cchTextMax);
}
if(pDispInfo->item.mask & LVIF_IMAGE)
pDispInfo->item.iImage = 0;//set image to first in list *pResult = 0;
}现在的问题是:界面上已经显示了很多条记录,当进行多选时,此时的现象就是,把以前已经选择的记录在选一遍,然后再选择当前选择的记录,这样刷新频率就很高,相当于把所有已经选择的记录从新选一遍.如何就像没有与数据库绑定时,进行多选时,你选择当前记录时,当前记录的底色就变了,而不影响其他已经选择的.

解决方案 »

  1.   

    你这样用好像并不能提高你的效率啊?不一定理解了你的意思;第一: 如果你的数据是10万条以下, 你还不如一次读到ListCtrl里头, 以后显示操作都很快; 考虑首次插入如此大量数据, 你可以用单独一个线程来做插入工作;
    第二: 你也可以每次从数据库里读100-1000条数据, 翻页显示; 这样也很快, 也不会占用多少内存;第三: OnGetdispinfo这个东东的好处是你不用保存2份数据(一般是ListCtrl保存一份, 用户自己保存一份), 但你每次从数据库取很少的记录得不偿失.你可以把读到数据保存到lParam中, 如果lParam中没有数据, 再到数据库取;