程序的基本思路是将查询结果存放到一个表(由OnBnClickedQuery实现)中,然后讲表中的内容显示到一个虚拟列表控件中。
现在的问题是显示结果都正确,但是虚拟列表控件显示速度很慢,问题可能出在GetDispInfo函数中,不知道如何修改,请高手指点。
谢谢
void CNewInputDlg::OnBnClickedQuery()
{
UpdateData(TRUE);
CDatabase db;
db.OpenEx("DRIVER=SQLServer;DATABASE=RTUMIS;UID=sa;PWD=118;");
db.ExecuteSQL("delete temp");
CString m_strSql="insert temp select *  from student where";
if(m_strXueHao.Trim().GetLength()>0)
m_strSql.Format(m_strSql+" XH='%s'   and",m_strXueHao);
if(m_strKaoShengHao.Trim().GetLength()>0)
m_strSql.Format(m_strSql+" KSH='%s'  and",m_strKaoShengHao);
if(m_strShenFenZheng.Trim().GetLength()>0)
m_strSql.Format(m_strSql+" SFZH='%s'  and",m_strShenFenZheng);
         m_strSql.Delete(m_strSql.GetLength()-5,5);
MessageBox(m_strSql);
db.ExecuteSQL(m_strSql);
LVCOLUMN Col;
Col.mask=LVCF_TEXT;
CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,"select * from temp");
rs.MoveFirst();
while(!rs.IsEOF())
{
   rs.MoveNext();
}
int m_Count=rs.GetRecordCount();


m_List.SetItemCountEx(m_Count);
m_List.Invalidate();
rs.Close();
db.Close();}void CNewInputDlg::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem= &(pDispInfo)->item;

CDatabase db;
db.OpenEx("DRIVER={SQL Server};DATABASE=RTUMIS;UID=sa;PWD=118;");
CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,"select * from temp"); int iItemIndx= pItem->iItem;
if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
rs.MoveFirst();
rs.Move(iItemIndx);
CString s;
switch(pItem->iSubItem){
case 0: //fill in main text
rs.GetFieldValue((short)0,s);
lstrcpy(pItem->pszText,s); 
 break;             
case 1: 
rs.GetFieldValue((short)1,s);
lstrcpy(pItem->pszText, s); 
break;
     }
     }
rs.Close();
db.Close();
*pResult = 0;
}

解决方案 »

  1.   

    用这个初始化一下看看:
    long count = 100;//Get number of records
    m_ctlList.SendMessage(LVM_SETITEMCOUNT, (WPARAM)count, (LPARAM)LVSICF_NOINVALIDATEALL);//LVSICF_NOSCROLL);
    再说,OnLvnGetdispinfoList1好像每次显示一行(还是item?)的时候都要调用一次吧?
    那样的话要连接多少次数据库呢?
      

  2.   

    不要把这些代码CDatabase db;
    db.OpenEx("DRIVER={SQL Server};DATABASE=RTUMIS;UID=sa;PWD=118;");
    CRecordset rs(&db);
    rs.Open(AFX_DB_USE_DEFAULT_TYPE,"select * from temp");放在OnLvnGetdispinfoList1函数里,此函数会被调用N次,也就是N次打开和关闭数据库,这就是速度慢的原因。把rs声明为成员变量,在这个函数里只进行赋值操作。
      

  3.   

    按照ColderRain(iFly)说得,现在速度改善了许多。
    如果要想通过双击virtual list的每一行就弹出一个对话框显示改行数据的话,应该怎么做呢?
      

  4.   

    先得到用户选中的索引。然后rs.Move(iItemIndx);接着rs.GetFieldValue显示数据,修改完毕以后rs.SetFieldValue。