Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / ASP.NET

A Collapsible TreeView in MasterPage

3.00/5 (2 votes)
30 Oct 2009CPOL1 min read 32.3K   1.1K  
Demonstrates how to tweak the TreeView control to make it collapsible when working with MasterPages.

Image 1

Introduction

Scenario: I wanted a collapsible menu (treeview) that will only show menu items from the current section/department. E.g. if in the HR section node, only show the HR submenu items on the menu. I had to use this menu on a MasterPage (that certainly complicates things!).

Using a TreeView control on a MasterPage can be a menace because the control is refreshed every time you go to another page. There are several solutions to this problem. I once came across a solution where you had to load the control's structure inside the viewstate; I also got a suggestion to 'buy' (hey, I am a developer) a control.

I decided to tweak the existing TreeView control. When I load the page, I will check the page's path and get the corresponding node from the TreeView. Then, I process the nodes as I wish.

Using the code

As the nodes are being bound to the TreeView, we check to see if the current node is pointing to the current page. If so, we set that node to be the selected node.

The rest is history. Play around with the parent nodes of the selected node in any way you wish. You can also specify default behavior, when a page that is not in the Sitemap is opened.

C#
protected void TreeView1_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
    //make the node that links to the current page the selected node.
    string currPage = Request.CurrentExecutionFilePath;

    if (currPage == e.Node.NavigateUrl)
    {
        e.Node.Select();
    }
}

protected void ProcessChildNode(string selNodePath, TreeNode tsn)
{
    //check child nodes
    if (tsn.ChildNodes.Count > 0)
    {

        foreach (TreeNode tsnChild in tsn.ChildNodes)
        {
            //use recursion for deeper tree levels
            if (tsnChild.ChildNodes.Count > 0)
            {
                //process child node
                ProcessChildNode(selNodePath, tsnChild);
            }
            if (selNodePath.Contains(tsnChild.ValuePath.ToString()))
            {
                tsnChild.Expand();
            }
            if (tsnChild.ChildNodes.Count > 0)
            {
                tsnChild.SelectAction = TreeNodeSelectAction.Expand;
            }
        }
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)