zoukankan      html  css  js  c++  java
  • DataGrid方法标注

    在VS2010中无法增加了CColumn和Ccolumns类

    解决方案,方案名->右击->添加类->ActiveX控件中的MFC类->添加弹出了“从ActiveX控件添加类向导,然后选择”文件“->位置处填写你所添加的控件的.Ocx文件(C:WINDOWSsystem32MSDATGRD.OCX),在这里我只是添加了CColumn 和CColumns 两个类。

    注意:用这种方法添加的Ccolumn和Ccolumns类,不仅函数名会改变,而且在运用的时候会出现各种问题,连最基本的Ccolumns cols=m_grid.GetItem(ColeVariant(long(0)));编译都不能通过,更是由于很多函数名的更改,造成很多困难。所以,我们可以先在VC++6.0中添加Microsoft DataGrid Control Version 6.0(OLEDB)控件,IDE会自动给我们添加所需要的函数,将添加后的Ccolumn和Ccolumns的头文件和源文件,复制到我们VS2008工程目录下,将它们添加到工程中,就可以正常使用了,而且编译也不会出任何问题!

    二、在DLG视图上,右击,选中:插入ActiveX控件,选择:Microsoft DataGridControl Version 6.0(OLEDB),然后将此Grid控件关联一个控件变量m_dataGrid

    三、初始化MS控件(即微软件的软件)

    在CdlgApp类中的initInstance()中加入:

    [cpp] view plaincopy
     
    1. AfxEnableControlContainer();   //初始化MS控件  

    四、引入ADO控件

    1、导入库文件

    使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:

    [cpp] view plaincopy
     
    1. #import "C:Program Filescommonfilessystemadomsado15.dll" no_namespacerename("EOF","EndOfFile")rename("BOF","FirstOfFile")  

    ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。

    类型库描述了自治接口,以及C++使用的COM vtable接口。

    当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,

    并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,#import引入ADO库文件的代码编译后,在项目的目录下生成了这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。

    程序的第三行指示ADO对象不使用名称空间,在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,因为文件的结尾也是以EOF结尾的,是为了避免与定义了自己的EOF的其他库冲突。 至于改为什么名字,可以根据自己的命名习惯自己确定。

    如何出现编译错误,可能是软件没能注册成功的原因,可以手动在  开始->运行中 写:regsvr32  (msado15.dll的地址,可以直接装msado15.dll拖到运行框中,将会自动出现它的地址)  

    2、初始化COM环境

    OLE DB 是基于COM技术编写的,ADO是OLE DB基础之上的用户程序,

    OLE DB是一个COM组件,在访问COM组件的时候需要初始化COM库,方法如下:

    (1)  ::CoInitialize(NULL); //初始化OLE/COM库环境

    //对数据库的访问在上下代码之间写,下面第三步就应该写在这里

    ::CoUninitialize();//既然初始化了环境,当然一定要记得释放他了

    (2)也可以调用MFC全局函数

    AfxOleInit();

    五:三大ADO指针的创建、实例化和与DataGrid控件的关联

    [cpp] view plaincopy
     
    1. _ConnectionPtr pConnection;  
    2.   
    3. _RecordsetPtr pRecordset;  
    4.   
    5. _CommandPtr pCommand;  
    6.   
    7. pConnection.CreateInstance(__uuidof(Connection));  
    8.   
    9. pRecordset.CreateInstance(__uuidof(Recordset));  
    10.   
    11. pCommand.CreateInstance(__uuidof(Command));  
    12.   
    13. try{  
    14.   
    15.          m_ptrConnection.CreateInstance(__uuidof(Connection));   
    16.   
    17.          ASSERT(m_ptrConnection);  // 判断m_ptrConnection是否有效  
    18.   
    19.          TCHAR currentDir[1024]={0};  
    20.   
    21.          GetCurrentDirectory(1024,currentDir);  
    22.   
    23.          CString connectStr;  
    24.   
    25.          connectStr.Format(L"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=%s\db2.mdb",currentDir);//我的数据库名为db2.mdb  
    26.   
    27.          m_ptrConnection->ConnectionString=(_bstr_t)connectStr;  
    28.   
    29.          if(m_ptrConnection->Open(_bstr_t(connectStr),"","",adConnectUnspecified) != S_OK)      //成功连接数据库  
    30.   
    31.          {  
    32.   
    33.               return false;  
    34.   
    35.          }  
    36.   
    37.      } catch(...)  
    38.   
    39.      {  
    40.   
    41.          CString str=L"连接数据库失败";  
    42.   
    43.          AfxMessageBox(str);  
    44.   
    45.      }  

    //////////////////下面实现打开连接////////////////

    [cpp] view plaincopy
     
    1. m_ptrRecordset-> CursorLocation = adUseClient;   //非常重要,如果没有,则无法显示数据  
    2.   
    3. HRESULT hr = m_ptrRecordset->Open(_bstr_t(L"select* from Main"), _variant_t((IDispatch*)m_ptrConnection, TRUE),  
    4.   
    5.               adOpenStatic,adLockBatchOptimistic, adCmdUnknown);  
    6.   
    7. m_dataGrid.putref_DataSource((LPUNKNOWN)m_ptrRecordset);  
    8.   
    9. m_dataGrid.Refresh();  
    10.   
    11. m_ptrConnection->Close();  //在窗口销毁时,关闭与数据库连接, 一般是在DestroyWindow()中实现  

    标注:putref_DataSource((LPUNKNOWN)m_ptrRecordset);

    1、这句代码是将CrecordSet对象与我们的DataGrid控件连接起来的函数,我看代码查了好久才查到,在VC6.0中原为SetRefDataSource,不知道在VS2010中怎么就变成它了,随便改接口函数真是害死人。

    2、m_ptrRecordset->CursorLocation = adUseClient;

    adUseClient是需要把数据传输到本地,应用举例是断开数据库进行Recordset操作,即在内存中操作,而不直接写入远端数据库,相反地有,adUseServer,是指直接在数据库中进行操作,下面这个例子在数据量大的时候,进行Find操作,比adUseClient省了很多时间。

    3。不用时关闭连接:m_ptrConnection->Close();  //在窗口销毁时,关闭与数据库连接, 一般是在DestroyWindow()中实现

    注意:我原想用ADO控件和DataGrid控件的结合的方法来实现,但在DataGrid控件的属性上设置DataSourceO 为ADO控件的ID时,出现很多朋友出现的错误:“该组件上的 GetValue 操作失败,生成错误代码 0x80020003”查了很多资料都没有办法解决。

    DataGrid函数

    COleVariant()是VARIANT的封装类,只是为了解决数据转换问题而设计的

    m_grid.GetRow()返回用户点击的行号

    m_grid.RowTop()返回指定行,顶部所在位置,如果是可见行,其值为负值

    m_grid.GetRowHeight()返回行高

    m_grid.SetText(s);   设置grid中的值

    m_grid.put_row(m_grid.get_row());  ///以下三句,实现,获取当前选中空格的数据
    m_grid.put_col(m_grid.get_col());
    CString str = m_grid. get_Text() ;获得当前焦点所在单元格数据。

    如何给DATAGRID控件生成的列表添加序号

    请参看我的另一篇文章:http://blog.csdn.net/harvic880925/article/details/7790980

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/5125359.html
Copyright © 2011-2022 走看看