将 MFC 网格绑定到数据库。






4.74/5 (12投票s)
2002 年 9 月 30 日
2分钟阅读

197697

4172
此版本的 MFC 网格适用于数据库。
引言
上周我发布了一个新版本的 MFC 网格控件,它可以与数据库一起工作;我已经更改了源代码,并从 CGridCtrl
子类化它,并且还删除了一些额外的代码。所以这是新版本。
创建此控件与 MFC 网格相同,只是当您要定义变量网格时,必须使用 CDbMFCGrid
而不是 CGridCtrl
来定义它。您还需要将msado15.dll导入到您的项目中。在你的stdafx.h中,你可以写类似这样的东西
#import "E:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )
这是有关此网格的其余信息
我已经用大多数 SQLServer 数据类型测试了这个网格,所以我认为它适用于大多数数据类型,除了 Image
,binary
,timestamp
,sql_variant
,uniqueidentifier
。 对于 MS-Access 数据库也发现了同样的情况,但我认为这些不会造成太大的麻烦,因为这些不是在网格中显示的非常常见的类型。 也许我稍后会向我的网格添加这些功能。 此外,如果有人想这样做,他/她可以将新版本邮寄给我,我会更新源代码。 毕竟它没有完全测试,可能存在一些错误。
如何使用?
简单。 就像在 MFC 网格文章中说的那样创建网格后,为其提供数据源和 sqlstring,然后像这样使用 Bind()
和 FillGrid()
函数
//SQL datasource //m_gridctrl.m_strDataSource = //L"Provider=SQLOLEDB.1;Integrated Security=SSPI; //Persist Security Info=False; //Initial Catalog=Test;Data Source=mazy; //Use Procedure for Prepare=1;Auto Translate=True; //Packet Size=4096;Workstation ID=MAZY;Use Encryption for //Data=False;Tag with column collation when possible=True"; //access datasource m_gridctrl.m_strDataSource = "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=db1.mdb"; m_gridctrl.m_strQuery = "select * from Table1"; m_gridctrl.Bind(); m_gridctrl.FillGrid();
就这样。 它读取数据源并填充网格。 然后,如果网格不是只读模式,如果用户编辑一个单元格,它将自动更新数据库; 此外,如果您选择行并按 DELETE 键,它将从数据库和网格中删除记录。
特点
- 要添加记录,您必须首先向网格添加一个新行。(您必须将其添加到最后一行),然后只需为网格调用
AddNewRecord()
函数。 不要忘记,此函数始终读取网格的最后一行并将其添加到数据库。//add new row to grid then : m_gridctrl.Refresh(); m_gridctrl.AddNewRecord();
- 当您单击基于单元格类型的固定列时,它会自动对行进行排序。
- 对于所有日期/时间类型,我将它们转换为
"%d/ %m/ %Y"
格式并将它们放入网格中,如果您想要其他日期/时间格式,您必须在两个地方编辑代码 - 首先在CDbMFCGrid::FillGrid(void)
函数中找到这行代码:CString str1 = date.Format(_T("%d/ %m/ %Y"));
并将其更改为您想要的格式,然后更正CALLBACK CDbMFCGrid::pfnCellDateCompare
函数中的代码。 它用于比较两个日期/时间值并对日期/时间列进行排序。 明白了吗? - 您也可以轻松地过滤网格
m_gridctrl.pRecordset->Filter = "col1 ='Mazy'"; m_gridctrl.FillGrid();
- 如果您在程序中使用
SetItemText()
并且想要更新数据库,则必须在SetItemText()
之后调用CDbMFCGrid::UpdateCell(int iRow,int iCol)
CDbMFCGrid::DeleteDataRow(int iRow)
函数用于从网格AND数据库中删除一行。