我现在使用CListCtrl虚拟列表,先遍历一遍数据库,把所有数据存放在CArray对象中,
然后在LVN_GETDISPINFO响应函数中再将CArray中的数据读出放到列表中。
其中遍历数据库相当费时,20K数据竟然要半分钟,100K数据几乎处于死机状态,找了
很多地方都没有找到很好的解决方案,还请高手支招,多谢!

解决方案 »

  1.   

    不要把数据读到array里了
    因为数据库的数据一般都是要存在记录集里,把记录集看作array就可以了
    这个不错,看看
      

  2.   

    http://www.codeguru.com/Cpp/controls/listview/advanced/article.php/c4151/
      

  3.   

    就是看了这个虚拟列表的例子我才使用CArray作为临时存储数据的对象。
    我也想直接通过_RecordsetPtr来读取数据库数据,但是因为我操作数据库和虚拟列表
    是在不同类中完成的,目前我是在APP类中定义两个公有变量:
    _RecordsetPtr m_pRs;
    _ConnectionPtr m_pConn;
    然后通过AfxGetApp()->m_pRs进行访问,可是在LVN_GETDISPINFO响应函数中去操作
    m_pRs时就会报错,怎么都搞不定。
      

  4.   

    ??
    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;
    }
    这是我的代码
      

  5.   

    哦,刚才终于搞定了,原来是在pList->SetItemCountEx(dwCount)将数据量传递给
    CListCtrl后我就关闭了数据库,所以在虚拟列表中操作记录集时失败,但有点不明白
    关闭数据库应该放在哪里操作?