Help and Support
 

powered byLive Search

How To Find an Item in a Tree Control Via its Label

Retired KB ArticleThis article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
Article ID:155895
Last Review:December 10, 2003
Revision:2.0
This article was previously published under Q155895
On This Page

SUMMARY

The "tree view" common control does not have any built-in method for searching the entire tree, or for selecting an item contained within the tree when given a specific item label. This article provides code that returns the location of any item in a tree when given a specific label to search for.

The GetItemByName() function takes the window handle of the tree control, HTREEITEM, which points to the item in the tree to start searching and a string for which to search.

Back to the top

MORE INFORMATION

Sample Code

#include <windows.h>
#include <commctrl.h>

// Note: If you have items with more than 50 characters
// of text, you'll need to increase this value.
#define MAXTEXTLEN 50

HTREEITEM GetItemByName(HWND hWnd, HTREEITEM hItem,
                        LPCTSTR szItemName)
{
    // If hItem is NULL, start search from root item.
    if (hItem == NULL)
        hItem = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM,
                                       TVGN_ROOT, 0);
    while (hItem != NULL)
    {
        char szBuffer[MAXTEXTLEN+1];
        TV_ITEM item;

        item.hItem = hItem;
        item.mask = TVIF_TEXT | TVIF_CHILDREN;
        item.pszText = szBuffer;
        item.cchTextMax = MAXTEXTLEN;
        SendMessage(hWnd, TVM_GETITEM, 0, (LPARAM)&item);

        // Did we find it?
        if (lstrcmp(szBuffer, szItemName) == 0)
            return hItem;

        // Check whether we have child items.
        if (item.cChildren)
        {
            // Recursively traverse child items.
            HTREEITEM hItemFound, hItemChild;

            hItemChild = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM,
                                                TVGN_CHILD, (LPARAM)hItem);
            hItemFound = GetItemByName(hWnd, hItemChild, szItemName);

            // Did we find it?
            if (hItemFound != NULL)
                return hItemFound;
        }

        // Go to next sibling item.
        hItem = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM,
                                       TVGN_NEXT, (LPARAM)hItem);
    }

    // Not found.
    return NULL;
}
				
For example, to search the entire tree for the word "Jeff" and then highlight that word, you can use the following code:

Using Windows SDK:
    HTREEITEM hItem;
    hItem = GetItemByName(hWndTreeCtrl, NULL, "Jeff");
    if (hItem != NULL)
        SendMessage(hWndTreeCtrl, TVM_SELECTITEM, TVGN_CARET,
                    (LPARAM)hItem);
				
Using MFC:
    HTREEITEM hItem = GetItemByName(m_TreeCtrl.GetSafeHwnd(),
                                    NULL, "Jeff");
    if (hItem != NULL)
        m_TreeCtrl.SelectItem(hItem);
				

Back to the top


APPLIES TO
Microsoft Visual C++ 2.2
Microsoft Visual C++ 4.0 Standard Edition
Microsoft Visual C++ 4.1 Subscription
Microsoft Visual C++ 4.2 Enterprise Edition
Microsoft Visual C++ 4.2 Professional Edition

Back to the top

Keywords: 
kbcode KB155895

Back to the top

Article Translations

 

Other Support Options

  • Need More Help?
    Contact a Support professional by E-mail, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.