2009-02-05 95 views
0

我的主頁上有一個treeview。當一個contentpage被加載時,我想保存treeview狀態(哪些節點被摺疊/展開)。我將節點存儲在一個ArrayList中。代碼:C#Treeview狀態展開

private void SaveTreeviewState(TreeNodeCollection nodes) 
{ 
    foreach (TreeNode t in nodes) 
    { 
     // Store expandable state in ArrayList (true or false) 
     //NodePaths.Add(t.Expanded); 
     NodePaths.Add(t); 

     // Check for childnods 
     if (t.ChildNodes.Count > 0) 
      // recall this method 
      SaveTreeviewState(t.ChildNodes); 

    } 
} 

此方法由樹視圖對象的unload事件稱爲:

protected void tvManual_Unload(object sender, EventArgs e) 
{ 
    SaveTreeviewState(tvManual.Nodes); 

    // Clear session 
    Session["Treeview"] = null; 

    // Add arraylistm to session 
    Session["Treeview"] = NodePaths; 

} 

在母版查看我的會話是否設置的Load事件。當會話設置時,我調用讀取會話的方法。

會話中的數組列表包含我所有的節點,所以這是正確的。但是,所有節點的屬性都已設置爲false。這是不正確的,因爲我擴展了多個節點。

希望你們瞭解我的問題,並能幫助我。

日Thnx先進

回答

1

因爲保存的列表其實是對象(TreeNode對象)的列表,你實際上是存儲的對象的引用。我猜測,在tvManual_Unload擴展狀態正在改變或類似的東西。可能您使用的inprocess會話類似於對對象的引用(沒有序列化),因此對對象屬性的任何更改對於存儲在會話中的對象也是可見的。

您可以通過將值存儲到會話中來避免此類副作用。例如,存儲字典<字符串,布爾>其中鍵將包含節點路徑,並且該值將包含擴展狀態。

+0

我現在存儲的值而不是對象: NodePaths.Add(t.Expanded); 它沒有幫助。所有的值都是假的 – Martijn 2009-02-05 15:01:59