martes, 27 de abril de 2010

Mantener el estado de un treeview entre distintas páginas navegadas

Para eso debemos añadir un fichero de clase con el siguiente código:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI.WebControls;

public class TreeViewState
{
public void SaveTreeView(TreeView treeView, string key)
{
List list = new List();
SaveTreeViewExpandedState(treeView.Nodes, list);
HttpContext.Current.Session[key + treeView.ID] = list;
}

private void SaveTreeViewExpandedState(TreeNodeCollection nodes, List list)
{
foreach (TreeNode node in nodes)
{
list.Add(node.Expanded);
if (node.ChildNodes.Count > 0)
{
SaveTreeViewExpandedState(node.ChildNodes, list);
}
}
}

private int RestoreTreeViewIndex;

public void RestoreTreeView(TreeView treeView, string key)
{
RestoreTreeViewIndex = 0;
RestoreTreeViewExpandedState(treeView.Nodes,
(List)HttpContext.Current.Session[key + treeView.ID] ?? new List());
}

private void RestoreTreeViewExpandedState(TreeNodeCollection nodes, List list)
{
foreach (TreeNode node in nodes)
{
if (RestoreTreeViewIndex >= list.Count) return;

node.Expanded = list[RestoreTreeViewIndex++];
if (node.ChildNodes.Count > 0)
{
RestoreTreeViewExpandedState(node.ChildNodes, list);
}
}
}
}


Una vez creada esta clase debemos incluir en la página o en el control de usuario el siguiente código.
En el load del arbol, una vez hayamos recuperado todos los elementos y generado la estructura del arbol ponemos la siguiente línea:

new TreeViewState().RestoreTreeView(arbol, this.GetType().ToString());

Y además de esto añadimos un evento Unload a nuestro arbol para que guarde el estado actual al cambiar de página.

protected void arbol_Unload(object sender, EventArgs e)
{
// save the state of all nodes.
new TreeViewState().SaveTreeView(arbol, this.GetType().ToString());
}

Y con esto ya se mantendrá perfectamente la estructura de3 nuestro TreeView entre las distintas páginas de nuestra aplicación.

No hay comentarios:

Publicar un comentario