树视图控件能够按层次结构组织和管理数据,通常用于显示树状结构数据。
先截个图 :
这个是程序的最终运行结果。其中树节点上的文本文字是从数据库中读取。
下面是程序步骤:
(1)新建一个基于对话框的应用程序TreeViewCtrl,在对话框中添加树视图控件。
(2)在类向导中将树视图控件命名为m_treectrl.
(3)选中树视图控件,右键点击属性,设置控件属性如图。
(4)因为要读取数据库,所以要首先链接数据库:
在stdafx.h文件中添加:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","ADOEOF")
(5)在TreeViewCtrl.cpp中InitInstance()函数里添加:
/*********************************************************************************************************/ m_pCon.CreateInstance("ADODB.Connection"); m_pRecord.CreateInstance("ADBDB.Recordset"); try { m_pCon->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=医药管理.mdb;Persist Security Info=False"; m_pCon->Open("","","",-1); } catch(...) { AfxMessageBox("数据库连接失败.",0,0); } /******************************************************************************************************************/
(6)在TreeViewCtrlDlg.h中添加需要的成员变量和成员函数:
public: CTreeCtrl m_treectrl; void FindNode(HTREEITEM h_parent,CString str); CImageList m_imagelist; HTREEITEM h_root;
(7)在TreeViewCtrlDlg.cpp中CTreeViewCtrlDlg::OnInitDialog()函数里添加:
//创建列表视图窗口 m_imagelist.Create(16,16,ILC_COLOR24|ILC_MASK,1,0); //向图像列表中添加图标 m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); //关联图像列表 m_treectrl.SetImageList(&m_imagelist,TVSIL_NORMAL); //添加根节点 h_root = m_treectrl.InsertItem("药品类别",0,1); CString str; //查询父类药品名称 m_pRecord = m_pCon->Execute("select * from leechdomkind where parenttype is null",0,adCmdText); HTREEITEM h_parent; while (! m_pRecord->ADOEOF) { str = (TCHAR*)(_bstr_t)m_pRecord->GetFields()->GetItem("leechdomtype")->Value; h_parent = m_treectrl.InsertItem(str,0,1,h_root); //将所有子节点添加到父节点下 FindNode(h_parent,str); m_pRecord->MoveNext(); }
(8)在TreeViewCtrlDlg.cpp中实现FindNode(HTREEITEM h_parent, CString str)函数:
void CTreeViewCtrlDlg::FindNode(HTREEITEM h_parent, CString str) { _ConnectionPtr tempcon; _RecordsetPtr temprecord; tempcon.CreateInstance("ADODB.connection"); temprecord.CreateInstance("ADODB.recordset"); tempcon->ConnectionString = m_pCon->ConnectionString; tempcon->Open("","","",-1); CString sql; sql.Format("select * from leechdomkind where parenttype = ‘%s‘",str); temprecord = tempcon->Execute((_bstr_t)sql,0,adCmdText); CString name; HTREEITEM h_temp; while (! temprecord->ADOEOF) { name =(TCHAR*)(_bstr_t) temprecord->GetFields()->GetItem("leechdomtype")->Value; h_temp = m_treectrl.InsertItem(name,0,1,h_parent); FindNode(h_temp,name); temprecord->MoveNext(); } }
至此这个例子所需要的程序已经写完了,数据库用的是Access2003。