一个好用的DBGRID

2016-01-29 12:04 29 1 收藏

一个好用的DBGRID,一个好用的DBGRID

【 tulaoshi.com - C语言心得技巧 】

一个好用的DBGRID --- VC数据库开发之二
作者:陈松乐

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载本文配套代码一 (演示CGridCtrl的使用)
下载本文配套代码二 (演示与CMYODBC的配合使用)

一、引言

在用vc开发关于数据库的项目时,通常我们只好用微软的DBGRID作为数据库表格控件,其实微软的DBGRID并不好用,想找一份好的帮助文档都找不到,并且界面并不友好,比起C++Builder中的DBGRID来说是逊色不少,但是DBGRID在开发数据库的项目中又是常用的控件,所以就一直想找一个好用的DBGRID,可是网上又没有找到。上次在无意中看到了CGridCtrl(一个很漂亮的表格控件,如果你还没有用过,可以到http://www.codetools.com/miscctrl/gridctrl.asp/下载,上面还有详细的使用说明)支持虚模式,在这种模式下,即使你向这个表格插入一百万条数据,它并不会真的生成一百万行,而是随着你的滚动条的滚动,计算出在屏幕上要显示的行和列,然后会向你提供一个接口,通过这个接口,你可以在这儿设置你要显示的数据。这给了我一些启示,我决定用它来做一个DBGRID。下面的例子是它的一个应用。



二、原理

DBGRID和一般的GRID的不同之处在于,一般的GRID并不适合显示大的数据量,如果你的一个查询结果有上万条记录的话,如果你都要插入到GRID中,这将是一个很慢的过程,并且你在GRID中移动滚动条的话,它的记录的滚动也是很慢的,而DBGRID并不会真正把这些记录的数据全部插入到控件中,当DBGRID的滚动条滚动时,它会根据DBGRID的显示面积的大小和查询得到的总的记录数计算出当前应该显示哪那些行,然后会把那几行的记录数据插入到表格中,这样速度当然是很快的,而且没有数据量多少的限制。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

幸运的是,CGridCtrl类已经为我们提供了这种机制,它是采用虚模式的方式,要使用这种方式,按照以下的步骤就可以了:

步骤一 初始化

void SetVirtualMode(TRUE) 设为虚模式BOOL SetRowCount(int nRows) 设置总的行数。BOOL SetFixedRowCount(int nFixedRows = 1)设置固定的行数据BOOL SetColumnCount(int nCols)设置列数BOOL SetFixedColumnCount(int nFixedCols = 1)设置固定的列数
步骤二 响应消息 显示数据
我们假设CGridCtrl是放在对话框上,而且它关联的变量是m_Grid,利用ClassWizard添加对话框的OnNotify响应函数。这个响应函数的写法是固定的,类似下面的代码:
BOOL CMyOdbcDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) {if (wParam == (WPARAM)m_Grid.GetDlgCtrlID()){*pResult = 1;GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;if (GVN_GETDISPINFO  == pDispInfo->hdr.code){/*这是我们自己加的函数,在这个函数里我们设置当前要显示的数据*/SetGridItem(pDispInfo);return TRUE;}}return CDialog::OnNotify(wParam, lParam, pResult);}
在上面的代码中,SetGridItem(pDispInfo)是我们自己加的函数,在这个函数里我们设置当前要显示的数据,pDispInfo是一个GV_DISPINFO的结构体对象,在这个结构中包含了每个单元格的信息,如行号,列号,有没有位图,背景色,前景色等,CGRIDCTRL会在当前要显示那个单元格时,会把这个单元格的行号,列号传递给我们,我们只要在里面设置要显示的数据就可以了。如下面是一个显示数据的例子。
int CMyOdbcDlg::SetGridItem(GV_DISPINFO *pDispInfo){pDispInfo->item.strText.Format("row%d,col%d",pDispInfo->item.row, pDispInfo->item.col); return 0;}

通过上面的介绍,我们应该已经会使用CGridCtrl虚模式,下面说明一下用CGridCtrl虚模式做DBGRID的原理,大家都知道,MFC的CRecordset类支持多种游标机制,如双向游标的,如果我们是用ClassWizard来生成一个查询的CRecordset的派生类的话,那么可以调用函数CRecordset::SetAbsolutePosition(),用这种方式方式来做DBGRID真是太简单了,因为在上面的int CMyOdbcDlg::SetGridItem(GV_DISPINFO *pDispInfo)函数中,我们已经知道要显示的是哪一行,哪一列的数据,所以只要通过CRecordset::SetAbsolutePosition(pDispInfo-item.row)函数,把游标定位到那一行,然后获取每个字段的数据就可以了。

来源:https://www.tulaoshi.com/n/20160129/1484517.html

延伸阅读
标签: 孕前
经期不宜服这八类药物 1.治疗妇科感染的阴道局部用药: 治疗阴道炎症的洗液、栓剂、泡腾片等应暂停使用。因为在月经期间,子宫黏膜充血,宫颈口松弛,加上阴道里有积血,非常适于细菌生长繁殖,若此时进行阴道局部用药,稍有不慎就会导致细菌逆行侵犯子宫腔及子宫内膜。 2.抗凝血药: 抗凝血药可引起月经过多,甚至大出血,经期应避免使用...
标签: 电脑入门
黑客:我控制了你的电脑 小白:怎么控制的? 黑客:用木马 小白:。。。。。。在哪里?我没看不见 黑客:打开你的任务管理器 小白:。。。。。。。任务管理器在哪? 黑客:。。。。。你的电脑下面!! 小白:我的电脑里面没有啊 黑客:算了,当我什么也没做过 黑客:我已经控制了你的电脑 小白:哦 黑客:害怕了吧?!嘿嘿 小白:来的正好...
#include "SHDocVw_OCX.h" #include "cdoex.h" #include "msado15.h" using namespace CDO; // 本文是ccrun(老妖)根据相关资料改的,在BCB 6.0 下成功编译并测试通过. // 假如有不能正常运行的,可能需要在机器上安装有Outlook. void __fastcall SaveWholePage(B...
标签: 电脑入门
一个细微动作/ ╰' 一个飘忽眼神/ ╰' 一个转身的距离/ ╰' 。☀☀  -------------------------------------------------------------------------------- ♬♬♬﹌﹌ ≌我喜欢听音...
标签: PHP
  这个分页函数非常高只能的 看看就知道了 function ppage($total, $page, $e_page = 15, $e_block = 10, $url = '', $color = '') { if(!strpos($url,'?'))    $url.='?'; else    $url.='&'; if($color<'') {    $color   ='<font color='.$color.''...

经验教程

482

收藏

57
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部