VC DataGrid控制元件使用總結
阿新 • • 發佈:2019-02-07
MS CDataGrid控制元件用法詳解
本文示例原始碼或素材下載
。DataGrid控制元件是VC方便地用來顯示資料的一個極好的網格控制元件,我不否認網上還有期它不少優秀的網格控制元件,但我總喜歡使用微軟自已的東西 。除非它滿足不了我的需要。不是我太依賴Microsoft,你想想,如果你最常用的開發工具是VC,VC是微軟的主打開發工具,它與Windows系統的相容性極好,連它的控制元件也不例外,你為何不先選用成熟的程式碼,如果它升級了,你的系統幾乎不作改動就可以繼續為你效勞,有什麼不好,這不完全是那種無謂的依靠,而是利用 。更重要的是你可以更注重你的系統功能,而不是程式碼的細節。
一、我先交待主要內容
在網格控制元件中顯示查詢的資料結果。
對網格控制元件的顯示進行控制(如列寬)。
對網格內容格式進行控制(如將小於1的小數顯示成百分數)
二、準備工作
先建立一個工程,我的主框架選用對話方塊,然後插入你DataGrid控制元件,見如圖1
圖1
找到Microsoft DataGrid OLEDB 6.0 控制元件,確定,出現圖所示對話方塊,這個對話方塊中你要根據需要選擇的類,這些類封裝了這個控制元件的幾乎所有功能有方法。這裡我只選擇了三個類:CDataGrid,CColumns,CColumn,如圖2(我們知道,ActiveX是基於COM的,這三個類是對這個控制元件的COM查詢介面的封裝,使你在使用時幾乎不知道自己在使用COM控制元件。正因為如此,你要想直接檢視這個控制元件的原始碼,也就不可能了。)
圖2
三、功能實現及程式碼
1.在網格控制元件中顯示查詢的資料結果。
資料庫接庫,並取得查詢的資料結果。這裡我使用了一個ADO封裝類(當然你可以使用其它的方法方法資料庫,而不會影響控制元件的使用)。
CADODatabase m_DBCn;//資料庫物件
CADORecordset m_Rs;//記錄集物件
CDataGRid m_ctrlDG;//DataGrid控制元件物件
...
CString strConnection; strConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;")
_T("Data Source=note.mdb"));
m_DBCn.Open((LPCTSTR)strConnection); //開啟程式資料庫
m_Rs.SetDatabase(&m_DBCn); m_Rs.Open(_T("select * from test;")); //執行查詢
m_ctrlDG.SetRefDataSource((LPUNKNOW)m_Rs.GetRecordset());//顯示在DataGrid控制元件中
如圖3:
圖3
2.對網格控制元件的顯示進行控制(如列寬)。 要實現對列的控制,就要先取得列物件。
CColumns cols = m_ctrlDG.GetColumns();//先取得列集
CColumn col = cols.GetItem(vt); //再取得列集中的列,由VARIANT vt變數指出列的索引號
然後,你就可以對當前列為所欲為,這裡我對它設定列寬 col.SetWidth(fWidth);//fWidth指定列寬 如圖4
圖4
3.對網格內容格式進行控制(如將小於1的小數顯示成百分數)
要設定列的顯示格式,還是要先取得列,再對它設定格式,取得列的方法同上。
col.SetNumberFormat(_T("0.0%"));//百分數格式 如圖5
圖5
4.除此之外,我們還可以對它多行顯示,如圖6
圖6
5.另外,還可以利用訊息機制,對控制元件的HeadClick訊息處理,使控制元件能進行排序。 (具體情況參見原始碼)
四、結束語
細心的朋友會發現,檢視相關類的方法名(函式名),能故名思意,看出控制元件的功能,另外在插入控制元件時,一般有也幫助檔案,不過是針VB的,而且VB的呼叫方法與VC差別較大,但只有對比VC和VB方法名的相似之處,你還是可以很快對這款控制元件上手,並運用到你的專案中去。
本文源程式在VC6.0英語版,Windows XP除錯通過,並附源程式(工程名 TestGrid)。
========
VC++ Datagrid應用例項詳解系列(1) - 基本功能
本文原始碼下載:
http://download.csdn.net/source/3133370
1) 簡單的演示了DataGrid元件和Data Control元件的使用方法;
2) 介紹了資料來源相對路徑的設定方法;
3) 對DataGrid控制元件的顯示進行控制
正文:
DataGrid控制元件是主要用於顯示資料的一個網格控制元件,本文所用的DataGrid控制元件全名為:Microsoft DataGrid Control 6.0(SP6)(OLEDB),下面簡稱DataGrid,輔助控制元件Microsoft Data Control 6.0(SP6)(OLEDB),下面簡稱ADODC,其中ADODC主要用於繫結資料來源並篩選需要的欄位,DataGrid元件用於按要求顯示已篩選的欄位。
VC++ 6.0本身沒有這些控制元件,控制元件的新增詳見:
http://www.vckbase.com/document/viewdoc/?id=1164
其中,Datagrid的類較多,新增需要的幾個就可以,這裡新增的有下面三個:CDataGrid、CColumns、CColumn。ADODC的類較少,按預設新增。
按MFC Wizard建dialog based工程檔案,命名為DBGridDemo,新增DataGrid元件和ADODC元件。
其中ADODC元件設定如下:
“Control”標籤頁中,使用”Use Connection String”選項,點Build,按嚮導選Access資料來源,通過測試後修改連線字串如下:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database//Demo.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False
其中:Data Source使用的路徑為相對路徑,表示:資料來源為原始碼資料夾下的Database資料夾下的Demo.mdb檔案。
然後在DataGrid元件右鍵,屬性中選擇ClassWizard,Class選擇:CDBGridDemoDlg,在Member Variables標籤頁中分別設定成員變數如下:
IDC_ADODC1增加成員變數:m_data;
IDC_DATAGRIDDemo增加成員變數:m_grid。
確定後,在DBGridDemoDlg.cpp中對初始化成員函式::OnInitDialog()新增程式碼如下:
BOOL CDBGridDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// Added code
CColumns Columns=m_grid.GetColumns(); //求列集合物件
CColumn Column;
Columns.Add(2); //在最後增加1列,注:列序號從0開始
Columns.Add(3); //再增加1列
Column=Columns.GetItem(COleVariant(long(0))); //取第一列物件
Column.SetWidth(80); //設定列寬度為80(畫素pi?)
Column.SetCaption("姓名"); //設定該列標題
//Column.SetAlignment(2); //列內容對齊設定:0居左,1居中,2居右
Column.SetDataField("name"); //設定該列繫結欄位
Column=Columns.GetItem(COleVariant(long(1))); //設定第二列
Column.SetWidth(80); //設定列寬度為80
Column.SetCaption("年齡"); //設定該列標題
Column.SetDataField("age"); //設定該列繫結欄位
Column=Columns.GetItem(COleVariant(long(2))); //設定第三列
Column.SetWidth(40); //設定列寬度為40
Column.SetCaption("性別"); //設定該列標題
Column.SetDataField("gender"); //設定該列繫結欄位
Column=Columns.GetItem(COleVariant(long(3))); //設定第四列
Column.SetWidth(120); //設定列寬度為120
Column.SetCaption("居住地"); //設定該列標題
Column.SetDataField("city"); //設定該列繫結欄位
m_grid.ReBind(); //實現與datagrid中的表格繫結
m_grid.Refresh(); //重新整理列表顯示
return TRUE; // return TRUE unless you set the focus to a control
}
以上是DataGrid元件基本功能的實現,其他功能如增加列下拉組合框、查詢、分頁、列印、匯出到Excel等功能會在本系列陸續介紹。
========
VC DataGrid的簡單使用範例
本文為DataGrid控制元件在VC6.0中使用的基本範例,主要功能為插入一行資料並在控制元件中顯示,及刪除一行資料並在控制元件中顯示。
1 在VC6.0中建立MFCApp(exe)工程;
2 匯入DataGrid控制元件:
路徑:Project-->Add To Project-->Conponents and Controls
選擇集合:
選擇元件,選好後別忘記“Insert”:
演示目前的功能僅需要選擇圖片中的三個類就可以了:
這時元件就被匯入到工具箱中了,在Form中畫好後再為其新增一個控制元件變數 m_ctrlDataGrid1;
3 實現資料繫結:
對於資料庫的操作,我在這裡使用了ADO來執行;
要使用ADO的話不要忘記在你的stdafx.h中將其匯入:
#import "c:/program files/common files/system/ado/msado15.dll"
我使用的是SQLSERVER2005 EXPRESS,也就是附帶在VS2005中的開發版本,資料庫連線字串的設定如下:
CString strSqlLink = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=SalManSystem;Data Source=.//SQLEXPRESS";
注意:Data Source的設定對比2005之前版本的設定略有不同;
對話方塊初始化時的資料繫結程式碼:
BOOL CTestDATAGRIDDlg::OnInitDialog()
...{
//................以上省略若干行
// TODO: Add extra initialization here
CString strConnection;
strConnection.Format(_T(sqllink));
m_ADODb.Open((LPCTSTR)strConnection); //開啟程式資料庫
m_Rs.SetDatabase(&m_DBCn);
m_Rs.Open(_T("select * from em_baseinfo;"));
m_ctrlDataGrid1.SetCaption(_T("Add Employeer")); //設定標題
m_ctrlDataGrid1.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset()); //繫結資料來源
return TRUE; // return TRUE unless you set the focus to a control
}
4 插入操作:
這個非常簡單,程式碼如下:
BOOL CTestDATAGRIDDlg::InsertEMInfo()
...{
CString strSQL;
strSQL.Format( _T("INSERT INTO em_baseinfo(em_name, em_id, em_sex, em_edu)VALUES('%s', '%s', '%s', '%s');")
, m_strName, m_strID, m_strSex, m_strEDU );
m_Rs.Open((LPCTSTR)strSQL);
m_Rs.Open(_T("select * from em_baseinfo;"));
m_ctrlDataGrid1.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());
return TRUE;
}
5 刪除操作:
這個需要稍微花點心思。
在這裡我的資料庫中將em_id設定為主鍵,所以可以只獲取指定行的id值來作為刪除條件,若是你的需求有變,那就需要多組合幾個鍵值了:
BOOL CTestDATAGRIDDlg::DelEMInfo()
...{
VARIANT index;
CColumns columns;
CColumn column;
index.vt=VT_INT;
columns=m_ctrlDG.GetColumns(); //得到當前選中行的列集
long nCount = columns.GetCount(); //列數
index.lVal = 1;
column = columns.GetItem(index);//順序得到單元格的值
CString strid;
strid = column.GetText();
strid.Remove(' ');
CString strSQL;
strSQL.Format( _T("delete from em_baseinfo where em_id='%s'")
, strid);
m_Rs.Open((LPCTSTR)strSQL);
m_Rs.Open(_T("select * from em_baseinfo;"));
m_ctrlDataGrid1.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());
return TRUE;
}
========
VC++ Datagrid應用例項詳解系列(2) – 篩選查詢
本文原始碼下載:
http://d.download.csdn.net/down/3143819/zxhx
1) 在系列(1)的基礎上添加了Date Time Picker元件,並利用該元件+按鈕實現DataGrid資料查詢;
2) 簡單介紹了Date Time Picker的用法;
3) 簡單介紹了在按鈕元件的OnClick事件中接收其他元件變數及更新變數的基本流程。
前文(1)補遺:
1) 資料來源繫結的設定方法:在Data Control元件中設定好資料來源後,右鍵DataGrid元件,選擇”Properties”,點選屬性頁右上角的三角箭頭,拉到“All”標籤頁,找到Data Source屬性,在下拉列表框中選擇“IDC ADODC1”,如下圖:
datagrid資料來源繫結
2) 有關vc6.0的補丁:使用上述控制元件最好是打上vc6.0 sp6補丁後再執行。
正文:
在對話方塊窗體上新增Date Time Picker元件,並新增兩個按鈕,對按鈕的Caption進行設定,分別為”查詢”和”全部顯示”。
對Date Time Picker控制元件點選右鍵,設定控制元件的成員變數,型別選擇CDateTimeCtrl,變數名為m_DtCtrl,基本用法與DataGrid差不多,也是設定成員變數。
在DBGridDemoDlg.cpp檔案中新增程式碼:
1) 對話方塊初始化函式中新增一列,並新增日期列的程式碼,按前文(1)介紹的方法進行即可,在此不再贅述。
2) 對查詢按鈕新增OnClick事件如下:
void CDBGridDemoDlg::OnBtQuery()
{
// TODO: Add your control notification handler code here
try
{
//獲取控制元件當前的資料,UpdateData(false):更新控制元件中的資料(依據現有的變數值)
UpdateData(TRUE);
//定義CTime型別變數vTime並初始化
CTime vTime(2011,3,1,3,3,3);
//從Date Time Picker控制元件(m_DtCtrl)中獲取時間值並賦給vTime
m_DtCtrl.GetTime(vTime);
//將vTime轉換成y-m-d格式的字串並賦給字串變數strDate
CString strDate=vTime.Format("%Y-%m-%d");
/* 可以在此另行設定連線字串 */
//m_data.SetConnectionString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database//Demo.mdb;Mode=Read;Persist Security Info=False");
/* datagrid輸出記錄篩選語句 */
m_data.SetRecordSource("select * from demotable where [datetime]=#"+strDate+"#");
//更新datagrid元件(m_data)中的資料
m_data.Refresh();
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
}
}
針對以上程式碼,在此特別介紹一下UpdateData()函式的用法:
UpdateData(TRUE):獲得控制元件當前的資料
UpdateData(FALSE):更新控制元件中的資料
如:一個edit控制元件設定變數為m_text,strText為控制元件中的一個變數,定義為:
CString strText;
UpdateData(TRUE);
strText = m_text;
表示:只有在呼叫了UpdateData(TRUE)後,才能獲得控制元件的當前輸入值(若沒輸入則為預設值),否則strText還是上次賦予的值(若沒有則顯示其預設值)。
若在m_text中輸入一個值,再UpdateData(FALSE),則表示:
控制元件m_text接收輸入的值,如果沒有UpdateData(FALSE),則該控制元件依然顯示原先的值。
另外再簡單說明一下上面Format()函式的引數的含義:
vTime.Format("%Y-%m-%d");
其中:第一個引數”Y”表示4位的年(如:2011),如果為”y”則只取後兩位(如:11),第二個引數”m”表示2位的月(如:03),此處大小寫顯示的結果相同,第三個引數”d”必須為小寫,表示2為的日,改為大寫則不顯示。
另外,需要注意一下CTime與CString之間的轉換,參考上面的程式碼即可。
按上面的設計,查詢完畢後,無法顯示所有資料,所以在此增加了顯示全部資料的按鈕,程式碼如下:
void CDBGridDemoDlg::OnBTShowAll()
{
// TODO: Add your control notification handler code here
try
{
UpdateData(TRUE);
m_data.SetRecordSource("select * from demotable");
m_data.Refresh();
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
}
}
如果希望看到所有資料,可以點選該按鈕。
========