VS2010 C++学习(6): ListCtl用法及ADO方式读写Access程序

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

 


猜你喜欢

转载自blog.csdn.net/dalong10/article/details/25594395
今日推荐