65.9K
CodeProject 正在变化。 阅读更多。
Home

将 MFC 网格绑定到数据库。

2002 年 9 月 30 日

2分钟阅读

viewsIcon

197697

downloadIcon

4172

此版本的 MFC 网格适用于数据库。

Sample Image - MFCGridDatabaseversion.jpg

引言

上周我发布了一个新版本的 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 数据类型测试了这个网格,所以我认为它适用于大多数数据类型,除了 Imagebinarytimestampsql_variantuniqueidentifier。 对于 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数据库中删除一行。
© . All rights reserved.