CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

树控件遍历问题??急!!!

楼主huaguli(学VC不要命)2005-01-27 11:12:43 在 VC/MFC / 基础类 提问

对话框中有一树控件,一按钮,单击按钮的代码里遍历树,找出打上钩的而且是成员(部门的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

相关问题

  • 如何遍历树控件?
  • CB6中遍历控件的方法急。。
  • 遍历控件问题
  • 遍历控件的问题.
  • 遍历控件问题?
  • 树的遍历
  • 层遍历树
  • 急!如何遍历一个窗体内的全部控件或对象?
  • 如何遍历动态加载的usercontrol中的控件?(急,高手帮忙)
  • 请教 二叉树的后续遍历 和 层次遍历算法???急急!!!

关键词

  • 节点
  • 函数
  • 代码
  • treectrl
  • hchilditem
  • hbrotheritem
  • travelchild
  • hitem
  • htreeitem
  • 遍历

得分解答快速导航

  • 帖主:huaguli
  • erben

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo