能不能把对象保存在ViewState中啊,如何序列号TreeView,ViewState在App_Code下面如何获取啊
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
    }
}

解决方案 »

  1.   

    viewstate 保存小量数据,
    比如当前索引啦, 小的数字, 之类的.可以限定的基本数据类型上, 不字符串长度要有限制.供回发时当作恢复现场把柄的.要是把现场整个都放到 viewstate , 无异于找死.
      

  2.   

    恩TreeView回发的时候你可以在初始化一次
      

  3.   

     放个hidden控件,然后赋值,比viewstate好些
      

  4.   

    可序列化的对象都可以保存在viewstate里面。
      

  5.   

    能不能把对象保存在ViewState中啊,
    ----------------------------------可以,序列化后保存.=======================================如何序列号TreeView,
    -----------------------------------是想问如何序列化TreeView? 因为TreeView 本身没有 SerializableAttribute 标记需要你用辅助类来实现 TreeView 的 序列化=======================================ViewState在App_Code下面如何获取啊不知道你想问什么
    what do you want to do ?