怎样删除CtreeCtrl控件的指定结点和这个结点下的所有结点?
原因是这样的,我要更新这个控件的所有结点信息.之前的结点有几个数据要更新,我要把之前的全部删除,然后导入新的数据并加入相应的结点.所有要删除一个结点级下面所有的结点.请问怎么删除?

解决方案 »

  1.   

    用CTreeCtrl来取mib信息,程序运行时已经加载过一次MIB文件,各结点也正常显示相应的信息。现在MIB文件中修改了一些数据,要在相应的CTreeCtrl结点中显示出来。是不是要从新加载一次MIB文件,也就是要把之前的CTreeCtrl的结点删除,从新加入结点?有没有别的办法?
      

  2.   

    除非你知道mib文件中已经改变的数据,否则只有遍历树做比较。最简单的方法就是重新加载mib,重置tree ctrl
      

  3.   

    MSDN删除节点的代码:
    CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_TREE1);
    ASSERT(pCtrl != NULL);// Look at all of the root-level items
    HTREEITEM hCurrent = pCtrl->GetNextItem(TVI_ROOT, TVGN_NEXT);
    while (hCurrent != NULL)
    {
       // Get the text for the item. Notice we use TVIF_TEXT because
       // we want to retrieve only the text, but also specify TVIF_HANDLE
       // because we're getting the item by its handle.
       TVITEM item;
       TCHAR szText[1024];
       item.hItem = hCurrent;
       item.mask = TVIF_TEXT | TVIF_HANDLE;
       item.pszText = szText;
       item.cchTextMax = 1024;   BOOL bWorked = pCtrl->GetItem(&item);   // Try to get the next item
       hCurrent = pCtrl->GetNextItem(hCurrent, TVGN_NEXT);   // If we successfuly retrieved an item, and the item's text
       // contains a lowercase letter 'e', delete the item.
       if (bWorked && _tcschr(item.pszText, 'e'))
          pCtrl->DeleteItem(item.hItem);
    }
      

  4.   

    在删除节点前先建立一个 HTREEITEM 和MIB数据的MAP , 然后按照MAP中的对应关系删除MIB中需要删除的数据, 最后直接删除节点。这样无需重新在tree控件中加载数据,同时也可保证数据能够同步
      

  5.   

    HTREEITEM CMibBrowserView::DelChild(HTREEITEM hItem)
    {
        HTREEITEM hPare=NULL;
    if(m_tree.ItemHasChildren(hItem))

    if(m_iCount>=0)
    m_iCount--;
    hPare=m_tree.GetParentItem(hItem);
    TRACE("Delete :%s\n",m_tree.GetItemText(hItem));
         m_tree.DeleteItem(hItem);
            return (m_iCount>=0)?DelChild(hPare):NULL; }
    else
    {
    ++m_iCount;
    TRACE("node :%s\n",m_tree.GetItemText(hItem));
    return DelChild(m_tree.GetNextItem(hItem,TVGN_CHILD));
    }
    }
      

  6.   

    写个遍历算法(递归)删除所有节点即可,我以前也做过MIB浏览器,也涉及到删除节点的问题,也是自己写的算法。void CLeftPaneView::diguiExpand(HTREEITEM TreeItem)
    {
    if(TreeItem   ==   NULL)   
    return;   
    while(TreeItem!=NULL)
    {
    if(m_Tree.ItemHasChildren(TreeItem))   
    {   
    m_Tree.Expand(TreeItem,TVE_EXPAND);   
    HTREEITEM   hChild   =   m_Tree.GetChildItem(TreeItem);   
    diguiExpand(hChild);   
    diguiExpand(m_Tree.GetNextSiblingItem(hChild));   
    }   
    TreeItem=m_Tree.GetNextSiblingItem(TreeItem);   
    }
    }这个是递归展开所有节点的算法,自己改一下,递归删除所有节点是一个道理。希望对你有帮助