树控件遍历问题??急!!!
对话框中有一树控件,一按钮,单击按钮的代码里遍历树,找出打上钩的而且是成员(部门的GetItemData==1,人员的GetItemData==2)的项写入m_Names
帮我看看下面的代码,有错,帮纠正一下,谢谢!
void CDlgTreeName::OnBnClickedOk()
{
UpdateData(TRUE);
HTREEITEM hItem=m_TreeCtrl.GetRootItem();
m_Names="";
TravelChild(hItem);
OnOK();
}
void CDlgTreeName::TravelChild(HTREEITEM Item)
{
HTREEITEM hChildItem,hBrotherItem;
//查找子节点,没有就结束
hChildItem=m_TreeCtrl.GetChildItem(Item);
if(hChildItem!=NULL)
{
if((m_TreeCtrl.GetItemData(hChildItem) == 2) && m_TreeCtrl.GetCheck(hChildItem))
{
m_Names+=m_NameList;
m_Names+=" ";
}
TravelChild(hChildItem);
//处理子节点的兄弟节点和其子节点
hBrotherItem = m_TreeCtrl.GetNextSiblingItem(hChildItem);
while (hBrotherItem)
{
if((m_TreeCtrl.GetItemData(hBrotherItem) == 2) && m_TreeCtrl.GetCheck(hBrotherItem))
{
m_NameList = m_TreeCtrl.GetItemText(hBrotherItem) m_Names+=m_NameList;
m_Names+=" ";
}
TravelChild(hBrotherItem);
hBrotherItem=m_TreeCtrl.GetNextSiblingItem(hBrotherItem);
}
}
}
问题点数:20、回复次数:8Top
1 楼GongJingXin521(野茫茫)回复于 2005-01-27 11:53:27 得分 0
是不是少写了一句m_NameList = m_TreeCtrl.GetItemText(hChildItem)Top
2 楼handwolf(青松崖)回复于 2005-01-27 11:54:29 得分 0
if((m_TreeCtrl.GetItemData(hChildItem) == 2) && m_TreeCtrl.GetCheck(hChildItem))
{
m_Names+=m_NameList;
m_Names+=" ";
}
改为
if((m_TreeCtrl.GetItemData(hChildItem) == 2) && m_TreeCtrl.GetCheck(hChildItem))
{
m_NameList = m_TreeCtrl.GetItemText(hChildItem);
m_Names+=m_NameList;
m_Names+=" ";
}Top
3 楼erben(于丹&易中天)回复于 2005-01-27 12:01:35 得分 20
在你以前帖子里已经给你解答过类似的问题了
这样就可以了!
void mytree::TravelChild(HTREEITEM hItem, BOOL ItemFlag)
{
HTREEITEM itm1=GetChildItem(hItem);
HTREEITEM itm2;
while(itm1)
{
SetCheck(itm1,ItemFlag);
itm2=itm1;
TravelChild(itm2, ItemFlag);
itm1=GetNextSiblingItem(itm1);
}
}
Top
4 楼erben(于丹&易中天)回复于 2005-01-27 12:03:17 得分 0
上面是遍历,你的代码里m_NameList没有赋值Top
5 楼huaguli(学VC不要命)回复于 2005-01-27 14:04:54 得分 0
我的树的样式是这样的:
.1
.11
.12
.2
.21
.22
.23
.3
.31
.32
.4
是不是因为我的树是这样的,没有总的结点,(1,2,3,4是平等的),所以不能 HTREEITEM hItem=m_TreeCtrl.GetRootItem();
Top
6 楼erben(于丹&易中天)回复于 2005-01-27 14:49:25 得分 0
如果根结点有兄弟结点(如楼主说的1234是同级结点),又是使用我说的那种递归方式(你那种递归可以不需要下面的改动)。
那么要把
void CDlgTreeName::OnBnClickedOk()
{
UpdateData(TRUE);
HTREEITEM hItem=m_TreeCtrl.GetRootItem();
m_Names="";
TravelChild(hItem);
OnOK();
}
变成
void CDlgTreeName::OnBnClickedOk()
{
UpdateData(TRUE);
HTREEITEM hItem=m_TreeCtrl.GetRootItem();
m_Names="";
while(hItem)
{
TravelChild(hItem);
hItem=m_TreeCtrl.GetNextSiblingItem(hItem);
}
OnOK();
}
Top
7 楼handwolf(青松崖)回复于 2005-01-27 15:27:59 得分 0
这个简洁的递归函数是为你写的,函数名改为TravelItem了,如此调用
void CDlgTreeName::OnBnClickedOk()
{
UpdateData(TRUE);
HTREEITEM hItem=m_TreeCtrl.GetRootItem();
m_Names="";
TravelItem(hItem);
OnOK();
}
//函数代码
void CDlgTreeName::TravelItem(HTREEITEM Item)
{
if(Item == NULL)
return;
//首先,处理自己
if((m_TreeCtrl.GetItemData(Item) == 2) && m_TreeCtrl.GetCheck(Item))
{
m_NameList = m_TreeCtrl.GetItemText(Item);
m_Names+=m_NameList;
m_Names+=" ";
}
//处理第一个子节点
HTREEITEM hChildItem=m_TreeCtrl.GetChildItem(Item);
if(hChildItem!=NULL){
TravelItem(hChildItem);
}
//处理下一个兄弟节点
HTREEITEM hBrotherItem = m_TreeCtrl.GetNextSiblingItem(Item);
if(hBrotherItem!=NULL){
TravelItem(hBrotherItem);
}
//end
return;
}Top
8 楼gogowhy(123)回复于 2005-03-08 10:30:31 得分 0
mTop




