我现在使用CListCtrl虚拟列表,先遍历一遍数据库,把所有数据存放在CArray对象中,
然后在LVN_GETDISPINFO响应函数中再将CArray中的数据读出放到列表中。
其中遍历数据库相当费时,20K数据竟然要半分钟,100K数据几乎处于死机状态,找了
很多地方都没有找到很好的解决方案,还请高手支招,多谢!
然后在LVN_GETDISPINFO响应函数中再将CArray中的数据读出放到列表中。
其中遍历数据库相当费时,20K数据竟然要半分钟,100K数据几乎处于死机状态,找了
很多地方都没有找到很好的解决方案,还请高手支招,多谢!
因为数据库的数据一般都是要存在记录集里,把记录集看作array就可以了
这个不错,看看
我也想直接通过_RecordsetPtr来读取数据库数据,但是因为我操作数据库和虚拟列表
是在不同类中完成的,目前我是在APP类中定义两个公有变量:
_RecordsetPtr m_pRs;
_ConnectionPtr m_pConn;
然后通过AfxGetApp()->m_pRs进行访问,可是在LVN_GETDISPINFO响应函数中去操作
m_pRs时就会报错,怎么都搞不定。
void CTryCtrlListDlg::OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
LV_ITEM* pItem= &(pDispInfo)->item;
m_pRecordset->Move(pItem->iItem,(long)1);
if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
// then display the appropriate column
lstrcpy(pItem->pszText,m_pRecordset->GetCollect((long)pItem->iSubItem).vt==VT_NULL?"":(char*)(_bstr_t)m_pRecordset->GetCollect((long)pItem->iSubItem));
}
*pResult = 0;
}
这是我的代码
CListCtrl后我就关闭了数据库,所以在虚拟列表中操作记录集时失败,但有点不明白
关闭数据库应该放在哪里操作?