首页 > 代码库 > 树形图控件(附加读取数据库)

树形图控件(附加读取数据库)

树视图控件能够按层次结构组织和管理数据,通常用于显示树状结构数据。

先截个图 :

image

这个是程序的最终运行结果。其中树节点上的文本文字是从数据库中读取。

下面是程序步骤:
     (1)新建一个基于对话框的应用程序TreeViewCtrl,在对话框中添加树视图控件。
     (2)在类向导中将树视图控件命名为m_treectrl.
     (3)选中树视图控件,右键点击属性,设置控件属性如图。

image

(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。