VS2010環境下MFC使用DataGrid綁定數據源
參考:http://blog.csdn.net/fddqfddq/article/details/7874706
詳細介紹如何在MFC中使用DataGrid控件實現數據綁定。
1:新建一個MFC應用程序:DataGridDemo
2:選擇基於對話框,然后一直下一步,直到完成。
3:為了簡單,清除多於的東西。
4:現在要插入一個DataGrid控件,前提是你已經將控件添加到工具箱了。
VS2010默認沒有這個控件。添加辦法如下:
在工具欄空白處右鍵,選中選擇項,彈出一個選擇工具項的對話框,選中“COM組件”選 項卡
點擊“選擇”按鈕,因為我是win7 64位的系統,所以路徑為SysWOW64,如果為32位請找system32。如下圖:
5:選擇MSDATGRD.OCX。選擇后,確定。工具箱中應該有了DataGrid控件了。
6:現在要注冊這個組件。
這一步非常重要!
需要下載文件:MSDATGRD.OCX
下載地址:http://download.csdn.net/detail/shijiufeng/3198530
注冊方法:命令行 regsvr32.exe C:\Windows\System32\MSDATGRD.OCX
注意:如果出現"can not initialize data binding“的錯誤,則還需要注冊MSSTDFMT.DLL文件
7:成功注冊后現在就來添加DataGrid控件了。
在DataGridDemo界面右鍵選擇:"插入Acitve控件"然后選擇DataGrid,或者直接從工具箱上拖上來。
8:將DataGrid的ID和Caption的屬性修改為IDC_DATAGRID_TEST 如圖:
9:關鍵的一步:在解決方案上右鍵,添加-類-ActiveX控件中的MFC類
10:點擊“添加”按鈕后在選擇“文件”找到剛才的控件的位置,這里選擇Column和Columns兩個接口,其它的也可以選擇,但是不要選擇IDataGrid接口:
因為IDataGrid接口選擇后生成的類CDataGrid繼承的是COleDispatchDriver類,我們需要的是CDataGrid繼承CWnd類。
至於類CDataGrid的文件CDataGrid.h我們想其它辦法解決。
11:我們從另外的地方將DataGrid.h、DataGrid.cpp復制到項目中。
其它 的設置如在DataGridDemoDlg.h : 頭文件中添加引用與代碼
// DataGridDemoDlg.h : 頭文件 #include "DataGrid.h" #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") CDataGrid m_dbTest; //數據庫連接與數據集 ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset;
在 DataGridDemoDlg.cpp : 實現文件中添加引用與代碼
#include "CColumn.h" #include "CColumns0.h" #include "DataGrid.h" // TODO: 在此添加額外的初始化代碼 //------初始化數據庫------// //AfxOleInit(); m_pConnection.CreateInstance("ADODB.Connection"); //------------------------// try { m_pConnection->ConnectionTimeout = 8; m_pConnection->PutCursorLocation(adUseClient); m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\DataBase\\LoginDemo.accdb;","","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("數據庫連接失敗"); return FALSE; } //---------初始化記錄集對象---------------// try { m_pRecordset.CreateInstance("ADODB.Recordset"); //打開記錄集 m_pRecordset->Open("SELECT * FROM BALANCE",_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); } catch(_com_error e)///捕捉異常 { CString temp; temp.Format("aaa連接數據庫錯誤信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return 0; } m_dbTest.SetRefDataSource(NULL); m_dbTest.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbTest.Refresh(); //另外要注意如下方法內紅色部分。 void CData_Disp2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX,IDC_DATAGRID_TEST,m_dbTest); }
最后結果如下:
12:可能出錯的地方:
m_dbTest.SetRefDataSource(NULL);
m_dbTest.SetRefDataSource((LPUNKNOWN)m_pRecordset);
如果用生成的CDataGrid.h,里面的方法為putref_DataSource
DDX_Control(pDX,IDC_DATAGRID_TEST,m_dbTest); 這句話可能也會報錯,
因為VS2010生成的類CDataGrid繼承的是COleDispatchDriver類,我們需要的是CDataGrid繼承CWnd類。
所以最好還是用其它地方的DataGrid.h和DataGrid.cpp文件來替換Vs2010生成的。
最后提供這個例子的代碼下載: