VS2010 C++学习(6): ListCtl用法及ADO方式读写Access程序
学习VC++编制的ListCtl用法及ADO方式读写Access程序的应用。
一、 主要内容:
1. 基于ListCtl用法的设计;
2. 基于ADO方式读写Access程序的应用;
程序运行示例如下:
二、 设计实现:
(一)、首记录、上下记录、尾记录的实现
首先在LISTctrl中取消当前选中的Item ,然后移动数据库的记录,最后显示选中 新记录 。
(二)、增加、删除、编辑按钮的实现
对数据集进行增加、删除、编辑操作,然后更新LISTctrl。
(三)、使用了邓学彬设置列表控件(ListCtrl)各种颜色的类
http://download.csdn.net/detail/cometnet/4970247
三、 基础知识:
(一)、ListCtl用法
1. 设置listctrl 风格及扩展风格
LONGlStyle;
lStyle= GetWindowLong(m_List.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle&= ~LVS_TYPEMASK; //清除显示方式位
lStyle|= LVS_REPORT; //设置style
SetWindowLong(m_List.m_hWnd,GWL_STYLE, lStyle);//设置style
DWORDdwStyle = m_List.GetExtendedStyle();
dwStyle|= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle|= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle|= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_List.SetExtendedStyle(dwStyle);//设置扩展风格
2. InsertColumn函数
函数属于CListCrl类中的。
位于vc安装目录的vc\atlmfc\include路径下。
函数功能:在报告模式下插入一列
函数原型:int InsertColumn(int nCol, const LVCOLUMN*pColumn);
int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
参数: nCol表示要插入列的列号。
pColumn 为新建列属性的LVCOLUMN结构的地址。
对于第二种函数重载,参数lpszcolumnHeading 为列标题的字符串的地址,所以可以使用一个字符串,比如 "姓名"。
nFormat 指定列对齐方式的整数,缺省值是左对齐。它可以为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。
nWidth 以像素为单位的列宽。缺省值为-1,表示没有设置列宽。
nSubItem 与列相关联的子项的索引。缺省值为-1,表示没有子项与列相关。
例子:
m_List.InsertColumn(0,_T("客户地址"),LVCFMT_CENTER,80,-1);
3. 插入数据
m_List.InsertColumn(0,_T("测点ID"),LVCFMT_CENTER,80,-1); //插入列
m_List.InsertColumn(1,_T("站号"),LVCFMT_CENTER,80,-1);
m_List.InsertColumn(2,_T("站名"),LVCFMT_CENTER,180,-1);
m_List.InsertColumn(3,_T("测点性质"),LVCFMT_CENTER,80,-1);
m_List.InsertItem(0, _T( “1”)); //插入行
m_List.SetItemText(0,1, _T( “1”)); //设置数据
m_List.SetItemText(0,2, _T( “五条路”));
m_List.SetItemText(0,3,_T( “2”));
4. 选中和取消选中一行
int nIndex =0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex,0, LVIS_SELECTED|LVIS_FOCUSED);
5. 得到单击的listctrl的行列号
NM_LISTVIEW* pNMListView =(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
6. 删除的listctrl的一行
m_List.SetRedraw(FALSE);
//删除一行
m_List.DeleteItem(nItem);
m_List.SetRedraw(TRUE);
(二)、使用ADO读写Access数据库
1. 在StdAfx.h头文件中加入此句子
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")//不要命名空间,重命//名EOF为adoEOF
这句话意味使用msado15.dll动态连接库文件,里面就有ADO
2. 初始化COM库,引入ADO库定义文件用Connection对象连接数据库
在CWinApp::InitInstance()的重载函数中使用AfxOleInit()来初始化COM库,请看如下代码:
BOOLCEx006App::InitInstance()
{
//………….
AfxOleInit();
3. 实现从数据库中提取显示数据。
CoInitialize(NULL); //初始化COM组件
_ConnectionPtrpConn(__uuidof(Connection)); //实例化一个connection对象pConn
_RecordsetPtrpRst(__uuidof(Recordset)); //实例化一个Recordset对象pRst
_CommandPtrpCmd(__uuidof(Command)); //实例化一个Command对象pCmd
pConn->ConnectionString="Provider=MIcrosoft.Jet.OLEDB.4.0;Datasource=student.mdb";
//通过pConn对象连接字符串,连接到ACCESS数据库,这里ACCESS数据库在C根目录下
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="SELECT* FROM stu"; //通过pCmd对象访问数据库
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->rsEOF)
{ ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("学号"));
//把数据库中学号这列的内容放入IDC_LIST1的LIST控件中
pRst->MoveNext(); //下移一个
}
pRst->Close(); //关闭对象
pConn->Close();
pCmd.Release(); //释放对象
pRst.Release();
pConn.Release();
CoUninitialize(); //卸载COM组件
4. 实现插入记录。
CoInitialize(NULL);
_ConnectionPtrpConn(__uuidof(Connection));
_RecordsetPtrpRst(__uuidof(Recordset));
_CommandPtrpCmd(__uuidof(Command));
_variant_tRecordsAffected; //申请一个_variant_t类型的的变量
pConn->ConnectionString="Provider=MIcrosoft.Jet.OLEDB.4.0;Datasource=student.mdb";
pConn->Open("","","",adConnectUnspecified);
pRst=pConn->Execute("INSERTINTO stu (学号,姓名,电话) VALUES('2222','dddd','123456')",&RecordsAffected,adCmdText);
//pRst->Close(); //若有此句可以实现插入,但会产生runtime错误提示
pConn->Close();
pCmd.Release();
pRst.Release();
pConn.Release();
CoUninitialize();
5. 实现删除记录。
// 删除当前记录
int i=0;
int nItem;
//取消选中记录
POSITION pos =m_List.GetFirstSelectedItemPosition();
if (!pos == NULL)
{
nItem = m_List.GetNextSelectedItem(pos);
//取消选中
m_List.SetItemState(nItem, 0, LVIS_SELECTED|LVIS_FOCUSED);
}
_variant_t var;
CString strTemp;
UpdateData(true);
m_sSqlTable.Format(_T("SELECT * FROM 测点信息"));//
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{ m_pRecordset->Open(m_sSqlTable.AllocSysString(),
theApp.m_pConnection1.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error *e)
{ AfxMessageBox(e->ErrorMessage());
return ;
}
try
{ if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{ var= m_pRecordset->GetCollect("zhid");
strTemp = (LPCSTR)_bstr_t(var);
if(strTemp == m_zhid)
{ m_pRecordset->Delete(adAffectCurrent);
m_List.SetRedraw(FALSE);
//删除一行
m_List.DeleteItem(nItem);
m_List.SetRedraw(TRUE);
m_pRecordset->MoveLast();
}
i++;
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pRecordset = NULL;
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
return ;
}
MoveRecord(nItem);
//滚动滚动条.使最后一条可见
m_List.EnsureVisible(nItem-1, FALSE);
return ;
四、 程序下载:
http://download.csdn.net/detail/dalong10/7266261