本人意圖將數據庫中的內容加入樹型控件中,通過建立數據庫,再與樹型控件相連,實現數據庫的訪問。查詢結構清晰明了,操作方便。
現將其方法闡述如下:
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);
}
總結:本方法以樹型控件形式實現可視化數據庫浏覽,編程實現簡單,實際操作方便。