五,ListControl用法小结
1.初始化工作(以本人程序为例)
//列表框的格式设定
DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |
LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT;
m_list.SetExtendedStyle(dwExStyle);
//列表框字段名插入
m_list.InsertColumn(0,"姓名",LVCFMT_CENTER,80);
m_list.InsertColumn(1,"职务",LVCFMT_CENTER,80);
m_list.InsertColumn(2,"年龄",LVCFMT_CENTER,80);
m_list.InsertColumn(3,"手机",LVCFMT_CENTER,120);
m_list.InsertColumn(4,"审批状态",LVCFMT_CENTER,100);
2.将数据库中数据插入ListControl
这里我们分两种数据库访问方式分别介绍:
第一种,ADO方式
_ConnectionPtr PConn(__uuidof(Connection));
_RecordsetPtr PRst(__uuidof(Recordset));
//PConn->ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";
PConn->Open("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=spinfo","","",adConnectUnspecified);
try{
PRst=PConn->Execute("select * from spinfo_record",NULL,adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
int i=0;
while (!PRst->adoEOF) {
m_list.InsertItem(i,(LPCTSTR)(_bstr_t)PRst->GetCollect("name"));
//Changes the text of a list view item or subitem.---引自MSDN m_list.SetItemText(i,1,(LPCTSTR)(_bstr_t)PRst->GetCollect("grade");
m_list.SetItemText(i,2,(LPCTSTR)(_bstr_t)PRst->GetCollect("age"));
m_list.SetItemText(i,3,(LPCTSTR)(_bstr_t)PRst->GetCollect("cell")); m_list.SetItemText(i,4,(LPCTSTR)(_bstr_t)PRst->GetCollect("state"));
i++;
PRst->MoveNext();
}
第二种,ODBC方式
与ADO方式基本类似,不同点在于ADO方式中,记录集中数据的采集用的是pRst指针指向的GetCollet()函数,而ODBC方式的CRecordset rs记录集采用的是rs对象的成员函数GetFieldValue()函数:rs.GetFieldValue(1,name);
小结:对于ListControl中数据的插入需要注意的是必须先插入当前index的Item,然后设置该index行的其他的SubItem(分项),SetItemText()的作用是:Changes the text of a list view item or subitem.---引自MSDN
补充:
listcontrol中获得当前选择行的方法为:
int nSelected=-1;
nSelected=m_l.GetNextItem(nSelected,LVNI_SELECTED);
listcontrol中获得当前选择行的某个itemtext的方法为:
m_l.GetItemText ( nSelected,NULL )
//其中第二个参数表示是第几个subitem。如果为NULL,则表示为Item
六,用TRY CATCH捕捉错误异常
一般在连接数据库和打开记录集时需要用TRY…CATCH来捕捉异常
1. ODBC方式有三种异常:
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CMemoryException,pEx)
{
pEx->ReportError();
AfxMessageBox ("memory exception");
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
2.ADO方式的异常:
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}