一个好用的DBGRID

废民007

废民007

2016-01-29 12:04

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

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

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

下载本文配套代码一 (演示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://m.tulaoshi.com/cyuyanjiaocheng/)

幸运的是,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)函数,把游标定位到那一行,然后获取每个字段的数据就可以了。
展开更多 50%)
分享

猜你喜欢

一个好用的DBGRID

C语言教程 C语言函数
一个好用的DBGRID

一个好用的VC DBGRID

编程语言 网络编程
一个好用的VC DBGRID

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

一个好用的分页函数

Web开发
一个好用的分页函数

如何实现在一个Dbgrid中显示多数据库

编程语言 网络编程
如何实现在一个Dbgrid中显示多数据库

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

一个非常不错的一个正则练习JS版

Web开发
一个非常不错的一个正则练习JS版

如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题

编程语言 网络编程
如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PSV《高达破坏者2》新人初期配置推荐解析

PSV《高达破坏者2》新人初期配置推荐解析

消息队列在VB.NET数据库开发中的应用

消息队列在VB.NET数据库开发中的应用
下拉加载更多内容 ↓