VC DataGrid控件使用总结
生活随笔
收集整理的這篇文章主要介紹了
VC DataGrid控件使用总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?MS CDataGrid控件用法詳解
本文示例源代碼或素材下載
。DataGrid控件是VC方便地用來顯示數據的一個極好的網格控件,我不否認網上還有期它不少優(yōu)秀的網格控件,但我總喜歡使用微軟自已的東西 。除非它滿足不了我的需要。不是我太依賴Microsoft,你想想,如果你最常用的開發(fā)工具是VC,VC是微軟的主打開發(fā)工具,它與Windows系統(tǒng)的兼容性極好,連它的控件也不例外,你為何不先選用成熟的代碼,如果它升級了,你的系統(tǒng)幾乎不作改動就可以繼續(xù)為你效勞,有什么不好,這不完全是那種無謂的依靠,而是利用 。更重要的是你可以更注重你的系統(tǒng)功能,而不是代碼的細節(jié)。
一、我先交待主要內容
在網格控件中顯示查詢的數據結果。
對網格控件的顯示進行控制(如列寬)。
對網格內容格式進行控制(如將小于1的小數顯示成百分數)
二、準備工作
先建立一個工程,我的主框架選用對話框,然后插入你DataGrid控件,見如圖1
圖1
找到Microsoft DataGrid OLEDB 6.0 控件,確定,出現(xiàn)圖所示對話框,這個對話框中你要根據需要選擇的類,這些類封裝了這個控件的幾乎所有功能有方法。這里我只選擇了三個類:CDataGrid,CColumns,CColumn,如圖2(我們知道,ActiveX是基于COM的,這三個類是對這個控件的COM查詢接口的封裝,使你在使用時幾乎不知道自己在使用COM控件。正因為如此,你要想直接查看這個控件的源代碼,也就不可能了。)
圖2
三、功能實現(xiàn)及代碼
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;")); //執(zhí)行查詢
m_ctrlDG.SetRefDataSource((LPUNKNOW)m_Rs.GetRecordset());//顯示在DataGrid控件中
如圖3:
圖3
2.對網格控件的顯示進行控制(如列寬)。 要實現(xiàn)對列的控制,就要先取得列對象。
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消息處理,使控件能進行排序。 (具體情況參見源代碼)
四、結束語
細心的朋友會發(fā)現(xiàn),查看相關類的方法名(函數名),能故名思意,看出控件的功能,另外在插入控件時,一般有也幫助文件,不過是針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(); ? ? ? ? ? ? ? ? ? ? ? ?//實現(xiàn)與datagrid中的表格綁定 ?
? ? m_grid.Refresh(); ? ? ? ? ? ? ? ? ? ? ? //刷新列表顯示 ?
? ? ? ? ??
? ? return TRUE; ?// return TRUE ?unless you set the focus to a control ?
} ?
?
以上是DataGrid組件基本功能的實現(xiàn),其他功能如增加列下拉組合框、查找、分頁、打印、導出到Excel等功能會在本系列陸續(xù)介紹。
========
VC DataGrid的簡單使用范例
? ? 本文為DataGrid控件在VC6.0中使用的基本范例,主要功能為插入一行數據并在控件中顯示,及刪除一行數據并在控件中顯示。
?
? ? 1 在VC6.0中建立MFCApp(exe)工程;
?
? ? 2 導入DataGrid控件:
? ? ? ? ? 路徑:Project-->Add To Project-->Conponents and Controls
?
? ? ? ?選擇集合:
?
? ? ? ? 選擇組件,選好后別忘記“Insert”:
?
? ? ? ?演示目前的功能僅需要選擇圖片中的三個類就可以了:
?
? ? ? ?這時組件就被導入到工具箱中了,在Form中畫好后再為其添加一個控件變量 m_ctrlDataGrid1;
?
? ? 3 實現(xiàn)數據綁定:
? ? 對于數據庫的操作,我在這里使用了ADO來執(zhí)行;
? ? 要使用ADO的話不要忘記在你的stdafx.h中將其導入:
#import "c:/program files/common files/system/ado/msado15.dll"
?
? ? 我使用的是SQLSERVER2005 EXPRESS,也就是附帶在VS2005中的開發(fā)版本,數據庫連接字符串的設置如下:
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組件,并利用該組件+按鈕實現(xiàn)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補丁后再執(zhí)行。
?
正文:
在對話框窗體上添加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):更新控件中的數據(依據現(xiàn)有的變量值) ?
? ? ? ? ? ? ? ? ? ?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()); ?
? ? } ?
} ?
如果希望看到所有數據,可以點擊該按鈕。
========
總結
以上是生活随笔為你收集整理的VC DataGrid控件使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++开发个人事务管理信息系统
- 下一篇: Windows系统漏洞学习总结