我在 CTreeView 的 OnInitialUpdate() 函数中写的插入树节点的代码
CTreeCtrl & TCtrl = GetTreeCtrl();
TCtrl.ModifyStyle(0,TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT);
HTREEITEM father = TCtrl.InsertItem(_T("日常消费"));
m_HTree[0] = TCtrl.InsertItem(_T("2011-9-2"),father);
m_HTree[1] = TCtrl.InsertItem(_T("2011-1-1"),father);
m_HTree[2] = TCtrl.InsertItem(_T("2010-2-1"),father);
m_ado.OnInitODBC();//用的是数据库提取数据作为插入节点
CString sql;
sql.Format(_T("select * from TALLYCAT"));
m_pRecordset = m_ado.GetRecordset(_bstr_t(sql));//记录指针指向第1条记录
while(!m_pRecordset->adoEOF)
{
**GetData()** ;
if (m_date == "2010-2-1")
{
if(TCtrl.ItemHasChildren(m_HTree[2]))//有子节点
{
HTREEITEM brother = TCtrl.GetChildItem(m_HTree[2]);//得到父项的首个孩子的句柄
**Search** (brother,m_HTree[2]);//遍历之后的兄弟节点
}
else{TCtrl.InsertItem(m_type,m_HTree[2]);//插入首 个孩子节点}
}
m_pRecordset->MoveNext();
}
Search 函数是这样的
void CTallyCatTreeView::Search(HTREEITEM brother,HTREEITEM father)
{
CTreeCtrl & TCtrl = GetTreeCtrl();
HTREEITEM bro = TCtrl.GetNextSiblingItem(brother);//得到下一个兄弟的句柄
if(bro != NULL)
{
CString str = TCtrl.GetItemText(bro);
if (!strcmp(m_type,str))
{
TCtrl.InsertItem(m_type,father);
}
else{Search(bro,father);}
}else{
TCtrl.InsertItem(m_type,father);
}
}
数据库是这样的
NUM NAME TYPE MONEY DATE
006 电冰箱 电器 2000 2010-2-1
007 电热毯 电器 200 2010-2-1
008 西红柿 食物 8 2010-2-1
GetData()函数主要是把数据库的数据付给CTreeView的成员变量
void CTallyCatTreeView::GetData(void)
{
m_date = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("DATE");
m_type = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("TYPE");
}
最后的显示是
2010-2-1的子节点分别是电器,电器,食物
但是我不想它重复阿,请帮帮我!
主要问题应该是search函数