DataGrid方法标注
在VS2010中无法增加了CColumn和Ccolumns类
解决方案,方案名->右击->添加类->ActiveX控件中的MFC类->添加弹出了“从ActiveX控件添加类向导,然后选择”文件“->位置处填写你所添加的控件的.Ocx文件(C:\WINDOWS\system32\MSDATGRD.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()中加入:
- AfxEnableControlContainer(); //初始化MS控件
四、引入ADO控件
1、导入库文件
使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
- #import "C:\Program Files\commonfiles\system\ado\msado15.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控件的关联
- _ConnectionPtr pConnection;
- _RecordsetPtr pRecordset;
- _CommandPtr pCommand;
- pConnection.CreateInstance(__uuidof(Connection));
- pRecordset.CreateInstance(__uuidof(Recordset));
- pCommand.CreateInstance(__uuidof(Command));
- try{
- m_ptrConnection.CreateInstance(__uuidof(Connection));
- ASSERT(m_ptrConnection); // 判断m_ptrConnection是否有效
- TCHAR currentDir[1024]={0};
- GetCurrentDirectory(1024,currentDir);
- CString connectStr;
- connectStr.Format(L"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=%s\\db2.mdb",currentDir);//我的数据库名为db2.mdb
- m_ptrConnection->ConnectionString=(_bstr_t)connectStr;
- if(m_ptrConnection->Open(_bstr_t(connectStr),"","",adConnectUnspecified) != S_OK) //成功连接数据库
- {
- return false;
- }
- } catch(...)
- {
- CString str=L"连接数据库失败";
- AfxMessageBox(str);
- }
//下面实现打开连接
- m_ptrRecordset-> CursorLocation = adUseClient; //非常重要,如果没有,则无法显示数据
- HRESULT hr = m_ptrRecordset->Open(_bstr_t(L"select* from Main"), _variant_t((IDispatch*)m_ptrConnection, TRUE),
- adOpenStatic,adLockBatchOptimistic, adCmdUnknown);
- m_dataGrid.putref_DataSource((LPUNKNOWN)m_ptrRecordset);
- m_dataGrid.Refresh();
- 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
DataGrid方法标注相关推荐
- 演示Thread.sleep(100)和Thread.currentThread().isInterrupted()+@Deprecated:将方法标注为废弃的方法...
package charpter08; public class TestInterrupt01 { public static void main(String[] args) { Processo ...
- JEECG中datagrid方法自定义查询条件
自定义加添加查询条件的用法: CriteriaQuery cq = new CriteriaQuery(EquipmentEntity.class, dataGrid); //查询条件组装器 org. ...
- easyUI的使用.datagrid()生成列表日期时间显示异常,一个方法带入有效修复
最近接手一个技术考古的开发任务,页面使用jsp加easyUI开发,这样用惯了vue组件的我着实头大,有之前写html页面和使用js的经验算是能过度一下.我这里是使用 $("#"). ...
- “半真半假”DeepFake换脸也能精准识别?阿里安全提出全新检测方法
一段包含多个人脸的视频中,攻击者只对一个或者几个人的人脸进行伪造,这种"半真半假"的伪造情况能否被检测识别?近日,阿里安全图灵实验室宣布,其已成功打造出针对这种换脸视频的DeepF ...
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
- 斜度符号标注_机械图纸尺寸标注规则,第1次见,太直观太形象了!测量工程师可以拿去教绘图的了!...
(一)基本规则 1.机件的真实大小应以图样上所注的尺寸数值为依据,与图形的大小及绘图的准确度无关. 2.图样中(包括技术要求和其它说明)的尺寸,以mm为单位时,不需标注计量单位的代号或名称,如采用其它 ...
- 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~四 分部方法从另一方面定义了类型的操作规范...
一 DBContext的构造方法,方法的重载 二 DBContext实例中,表实体对象是怎么被加入的 三 分部类是否破坏了单一职责 四 分部方法从另一方面定义了类型的操作规范 五 LINQ实体类中对属 ...
- jeecg自定义datagrid查询
jeecg自定义datagrid查询 为什么要写这篇文章? 我们了解,使用 jeecg 提供的 CriteriaQuery 查询方式,确实能满足绝大数的需求,但是往往有那么个比较复杂的情况,需要我们直 ...
- document.addeventlistener方法不执行_JUnit 5 测试方法的执行优先级
前言 使用单元测试有时对方法的执行顺序有要求,而默认情况下测试方法的执行并非按照编写顺序,这就导致测试用例因执行顺序而导致的不通过.这里我使用的JUnit版本是5.6.2,下面讲述如何自定义测试方法的 ...
最新文章
- 关于英伟达数字人文章的致歉和说明
- Windows Server 2016-Netdom Join加域并指定OU (一)
- jqGrid edit总结
- 拥抱变化——从Atlas到ASP.NET AJAX(1):下载安装总览
- python snmp采集交换机信息_Python采集12星座信息,分析出12星座的各个特点
- dart语言和java语言_Java不是文明语言吗?
- angularjs的表单验证
- tomcat 如何跳转到apache_第二十期:基于tomcat部署jforum站点,并结合nginx实现动静分离...
- 事态升级是什么意思_俗语“头不顶桑脚不踩槐;生不睡柳死不睡杨”啥意思 有道理吗...
- Backbone的RESTFUL API 解释
- pandas 修改 DataFrame 列名 1
- jsoniter与原生json对比
- [通讯方式] 串口通信
- 澳门科技大学计算机专业研究生,澳门科技大学 计算机专业
- css3变形 transform中复合写法的注意问题总结
- 封装一个自己的golang操作MySQL数据库工具
- css3上箭头怎么写,CSS3箭头
- GAL GAME 汉化教程攻略从零开始 1
- 如何隐藏一个窗口在任务栏
- dede采集插件自动采集文章图片自定义接口