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.youkuaiyun.com/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.youkuaiyun.com/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());
}
}
如果希望看到所有数据,可以点击该按钮。
========