程序的基本思路是将查询结果存放到一个表(由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;
}
现在的问题是显示结果都正确,但是虚拟列表控件显示速度很慢,问题可能出在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;
}
long count = 100;//Get number of records
m_ctlList.SendMessage(LVM_SETITEMCOUNT, (WPARAM)count, (LPARAM)LVSICF_NOINVALIDATEALL);//LVSICF_NOSCROLL);
再说,OnLvnGetdispinfoList1好像每次显示一行(还是item?)的时候都要调用一次吧?
那样的话要连接多少次数据库呢?
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声明为成员变量,在这个函数里只进行赋值操作。
如果要想通过双击virtual list的每一行就弹出一个对话框显示改行数据的话,应该怎么做呢?