树视图控件能够按层次结构组织和管理数据,通常用于显示树状结构数据。
先截个图 :
这个是程序的最终运行结果。其中树节点上的文本文字是从数据库中读取。
下面是程序步骤:
(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。