VC DataGrid控件使用总结

 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());  
    }  
}  


如果希望看到所有数据,可以点击该按钮。
========

你可能感兴趣的:(datagrid,VC,VC访问数据库)