Click here to Skip to main content
15,881,248 members
Articles / Web Development / ASP.NET

A Collapsible TreeView in MasterPage

Rate me:
Please Sign up or sign in to vote.
3.00/5 (2 votes)
30 Oct 2009CPOL1 min read 31.9K   1.1K   15   1
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)


Written By
Web Developer robasta.com
South Africa South Africa
Check out my website & LinkedIn on the links below:

https://robasta.com
https://www.linkedin.com/in/robertdondo/

Comments and Discussions

 
Generalproblem facing showing error linq namespace does not exists in namespace Pin
pinky_sood2-May-11 11:43
pinky_sood2-May-11 11:43 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.