• 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

  • 相关阅读:
    如何在SharePointDesigner订制页面里判断用户权限
    为SharePoint 2010中的FBA创建自定义登录页面
    javascript中的this到底指什么?
    用JAVASCRIPT实现静态对象、静态方法和静态属性
    简单的HoverMenu效果
    JavaScript 调用sharepoint内置webservice 更新item
    域中搜索用户email
    服务控制管理器错误
    SQL Server 2008/2005不能修改表结构的解决方法
    类集对枚举的支持
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/5125359.html
Copyright © 2020-2023  润新知