程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 樹型控件實現數據庫的訪問

樹型控件實現數據庫的訪問

編輯:關於VC++

本人意圖將數據庫中的內容加入樹型控件中,通過建立數據庫,再與樹型控件相連,實現數據庫的訪問。查詢結構清晰明了,操作方便。

現將其方法闡述如下:

1、建數據庫:建立Access數據庫,數據庫結構和內容見程序包access文件。

2、建立單文檔不基於數據庫支持的應用程序工程,視圖類繼承於CFormView,本程序

工程名Ppp,視圖類名為CPppView。

3、建立數據庫集,數據源采用DAO連接,繼承於CDaoRecordset,類名為 CShengSet

4、在Stdafx.h文件中加入支持DAO連接的數據源頭文件

#include <afxwin.h> // MFC core and standard components
  #include <afxext.h> // MFC extensions
  #include <afxdisp.h> // MFC Automation classes
  #include <afxdao.h> //加入行,實現本視圖類對Access數據庫的訪問
  #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
  #ifndef _AFX_NO_AFXCMN_SUPPORT
  #include <afxcmn.h> // MFC support for Windows Common Controls
  #endif

5、在PppView.h中加入數據集頭文件中。

#include"ShengSet.h"

同時定義數據集類變量

public:
  CShengSet *m_ShengSet;

6、在PppDoc.h中加入數據集頭文件中。

#include"ShengSet.h"

同時定義數據集類變量

public:
  CShengSet m_ShengSet;

7、在視圖類對話框中加入樹型控件(IDC_TREE1),定義其變量名為m_treectrl;

8、在PppView.cpp文件的OnInitialUpdate()函數中得到指向數據集的指針

CFormView::OnInitialUpdate();
  CPppDoc* pDoc = (CPppDoc*)GetDocument(); //得到指向文檔類指針
  m_ShengSet=&pDoc->m_ShengSet; //得到數據庫指針

9、在PppView.cpp文件的OnInitialUpdate()函數中對樹型控件初始化初始化時先打開數據庫表,找到第一條記錄,將省名稱插入樹型控件,然後移至下一條記錄,進行循環操作至省數據表尾。程序代碼如下:

void CPppView::OnInitialUpdate()
{
  CFormView::OnInitialUpdate();
  CPppDoc* pDoc = (CPppDoc*)GetDocument();
  m_ShengSet=&pDoc->m_ShengSet;
  TV_INSERTSTRUCT tvinsert;
  tvinsert.hParent = NULL;
  tvinsert.item.mask = TVIF_TEXT;  
  tvinsert.item.pszText = "全國";
  HTREEITEM hDad = m_treectrl.InsertItem(&tvinsert);
  if (m_ShengSet->IsOpen())
    m_ShengSet->Close();
  m_ShengSet->Open();
  m_ShengSet->MoveFirst();
  CString c1;
    char buff[80];
  while(!m_ShengSet->IsEOF())
  {
    c1=m_ShengSet->m_column1;
    wsprintf(buff,"%s",c1);
    tvinsert.item.pszText = buff;
   tvinsert.hParent = hDad;
    m_treectrl.InsertItem(&tvinsert);
   m_ShengSet->MoveNext();
  }
}

最終結果如圖1左邊窗口所示:

10、插入對話框資源(FormView),建立該對話框的新類CShengView,繼承於CRecordSetView,數據集選擇第3步數據集。同時在對話框中加入編輯框以顯示數據記錄。同時在ShengView.h頭文件中加入以下頭文件,

#include"PppDoc.h"
#include "ShengSet.h"

11、在mainfrm類中定義

public:
    CSplitterWnd m_wndSpMain;

運用向導加入OnCreateClient()函數和以下代碼實現數據記錄顯示

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
  if (!m_wndSpMain.CreateStatic(this, 1, 2))
  {
    TRACE0("Failed to create splitter window\n");
    return FALSE;
  }
  
  if (!m_wndSpMain.CreateView(0, 0, RUNTIME_CLASS(CPppView),
    CSize(180, 200), pContext))
  {
    TRACE0("Failed to create left pane view\n");
    return FALSE;
  }
  if (!m_wndSpMain.CreateView(0, 1,
    RUNTIME_CLASS(CShengView), CSize(100,100), pContext))
  {
    TRACE0("Failed to create right pane frame\n");
    return FALSE;
  }
  return TRUE;
}

該代碼實現本框架兩個窗口的顯示。至此本程序達到如下圖效果:

圖一

12、此時還不能實現數據的訪問功能,在PppDoc .h 文件中加入

public:
  CString Name;

13、運用向導在類CidView的控件IDC_TREE1加入OnSelchangedTree1()函數,函數代碼如下,代碼實現的功能是將將樹型控件的選擇項名稱賦給pDoc->Name。

void CIdView::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
  NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  CTreeCtrl* pTree2 = (CTreeCtrl*) GetDlgItem(IDC_TREE1);
  HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
  CPppDoc* pDoc = (CPppDoc*)GetDocument();
  CString hParentName;
  HTREEITEM hParent=pTree2->GetParentItem(hSelected);  
  if(hSelected!=NULL)
  {
     pDoc->Name=pTree2->GetItemText(hSelected);
  }  
  *pResult = 0;
}

14、運用向導在CshengView.cpp中加入OnTimer()函數,該函數根據樹型控件選擇項內容更新記錄內容,代碼如下:

void CShengView::OnTimer(UINT nIDEvent)
{
  CPppDoc* pDoc = (CPppDoc*)GetDocument();
  if (m_pSet->IsOpen())
  {
    char filter[60];
    wsprintf(filter,"[省].省名稱=''%s''",pDoc->Name);
    m_pSet->m_strFilter=filter;
    m_pSet->Requery();
    UpdateData(FALSE);
  }
}

15、在CShengView.cpp中的OnInitialUpdate()函數中加入以下代碼,該代碼每10毫秒觸發WM_TIMER事件,實現記錄的實時更新。

void CShengView::OnInitialUpdate()
{
   CRecordView::OnInitialUpdate();
   SetTimer(1,10,NULL);
}

總結:本方法以樹型控件形式實現可視化數據庫浏覽,編程實現簡單,實際操作方便。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved