1. 程式人生 > >VC DataGrid控制元件使用總結

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


如果希望看到所有資料,可以點選該按鈕。
========