TreeView控件保存恢復結點展開狀態

幫助TreeView保存和恢復結點展開狀態的輔助類
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Heros TreeView保存和恢復結點展開狀態的輔助類
/// </summary>
public class TreeNodesExpandStateManager : IDisposable
{
    TreeView _tree;
    List
<TreeNode> nodes = new List<TreeNode>();

    
public static string SessionKey = "TreeNodesExpandState";
    
public TreeNodesExpandStateManager(TreeView tree)
    {
        _tree 
= tree;
    }

    
/// <summary>
    
/// 保存當前樹的展開狀態
    
/// </summary>
    public void SaveExpandState()
    {
        
foreach (TreeNode node in this._tree.Nodes)
        {
            SearchExpandedNode(node);
        }
    }

    
private void SearchExpandedNode(TreeNode node)
    {
        
if (node == null)
            
return;
        
else
        {
            
if (node.Expanded ?? false)
            {
                nodes.Add(node);
                
foreach (TreeNode item in node.ChildNodes)
                {
                    SearchExpandedNode(item);
                }
            }
        }
    }

    
/// <summary>
    
/// 恢復當前樹的展開狀態
    
/// </summary>
    public void RestoreExpandState()
    {
        
foreach (TreeNode node in this._tree.Nodes)
        {
            SetNodeExpandState(node);
        }
    }

    
/// <summary>
    
/// 用於跨頁操作時,恢復到指定樹
    
/// </summary>
    
/// <param name="tree"></param>
    public void RestoreExpandStateToTree(TreeView tree)
    {
        
foreach (TreeNode node in tree.Nodes)
        {
            SetNodeExpandState(node);
        }
    }

    
private void SetNodeExpandState(TreeNode node)
    {
        
if (node == null)
            
return;
        
else
        {
            
if (this.nodes.Contains(node, new EqualEntity()))
            {
                node.Expand();
                
foreach (TreeNode item in node.ChildNodes)
                {
                    SetNodeExpandState(item);
                }
            }
        }
    }

    
/// <summary>
    
/// 將指定樹展開狀態存入會話,一般在樹的展開和合閉事件中調用
    
/// </summary>
    
/// <param name="tree">目標樹</param>
    public static void SaveExpandStateInSession(TreeView tree, string sessionKey)
    {
        
if (tree == null)
            
return;
        TreeNodesExpandStateManager manager 
= new TreeNodesExpandStateManager(tree);
        manager.SaveExpandState();
        HttpContext.Current.Session[sessionKey] 
= manager;
    }

    
/// <summary>
    
/// 將指定樹展開狀態存入默認會話,一般在樹的展開和合閉事件中調用
    
/// </summary>
    
/// <param name="tree">目標樹</param>
    public static void SaveExpandStateInSession(TreeView tree)
    {
        SaveExpandStateInSession(tree, SessionKey);
    }

    
/// <summary>
    
/// 將Session中的結點展開狀態恢復到指定樹,在樹結點添加結束後調用
    
/// </summary>
    
/// <param name="tree">目標樹</param>
    public static void RestoreExpandStateToTreeFromSession(TreeView tree, string sessionKey)
    {
        
if (HttpContext.Current.Session[sessionKey] == null || tree == null)
            
return;
        TreeNodesExpandStateManager manager 
= HttpContext.Current.Session[sessionKey] as TreeNodesExpandStateManager;
        manager.RestoreExpandStateToTree(tree);
    }
    
/// <summary>
    
/// 將默認Session中的結點展開狀態恢復到指定樹,在樹結點添加結束後調用
    
/// </summary>
    
/// <param name="tree">目標樹</param>
    public static void RestoreExpandStateToTreeFromSession(TreeView tree)
    {
        RestoreExpandStateToTreeFromSession(tree, SessionKey);
    }

    
#region IDisposable 成員

    
public void Dispose()
    {
        
this.nodes.Clear();
        
this.nodes = null;
        
this._tree.Dispose();
    }

    
#endregion

     
~TreeNodesExpandStateManager()
    {
        
this.Dispose();
    }

     
public class EqualEntity : IEqualityComparer<TreeNode>
     {
         
#region IEqualityComparer<TreeNode> 成員

         
public bool Equals(TreeNode x, TreeNode y)
         {
             
if (x == null || y == null)
                 
return false;
             
return x.Value.Equals(y.Value);
         }

         
public int GetHashCode(TreeNode obj)
         {
             
return obj.GetHashCode();
         }

         
#endregion
     }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章