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.
protected void TreeView1_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
string currPage = Request.CurrentExecutionFilePath;
if (currPage == e.Node.NavigateUrl)
{
e.Node.Select();
}
}
protected void ProcessChildNode(string selNodePath, TreeNode tsn)
{
if (tsn.ChildNodes.Count > 0)
{
foreach (TreeNode tsnChild in tsn.ChildNodes)
{
if (tsnChild.ChildNodes.Count > 0)
{
ProcessChildNode(selNodePath, tsnChild);
}
if (selNodePath.Contains(tsnChild.ValuePath.ToString()))
{
tsnChild.Expand();
}
if (tsnChild.ChildNodes.Count > 0)
{
tsnChild.SelectAction = TreeNodeSelectAction.Expand;
}
}
}
}