【原】Save TreeView Nodes Expansion/Collapse & Checkboxes State In Session
![](http://www.suodaotraining.com/images/cnblog/aspdotnet.png)
VB CODE:
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Imports Microsoft.VisualBasic
Imports System.Collections.Generic
Public Class TreeViewState
Private RestoreTreeViewIndex As Integer
Public Sub SaveTreeView(ByVal treeView As TreeView, ByVal key As String)
Dim listExpanded As New List(Of Nullable(Of Boolean))
Dim listChecked As New List(Of Nullable(Of Boolean))
SaveTreeViewExpandedState(treeView.Nodes, listExpanded)
SaveTreeViewCheckedState(treeView.Nodes, listChecked)
HttpContext.Current.Session("1" + key + treeView.ID) = listExpanded
HttpContext.Current.Session("2" + key + treeView.ID) = listChecked
End Sub
Private Sub SaveTreeViewExpandedState(ByVal nodes As TreeNodeCollection, ByVal list As List(Of Nullable(Of Boolean)))
For Each node As TreeNode In nodes
list.Add(node.Expanded)
If node.ChildNodes.Count > 0 Then
SaveTreeViewExpandedState(node.ChildNodes, list)
End If
Next
End Sub
Private Sub SaveTreeViewCheckedState(ByVal nodes As TreeNodeCollection, ByVal list As List(Of Nullable(Of Boolean)))
For Each node As TreeNode In nodes
Dim showCheckbox As Nullable(Of Boolean) = node.ShowCheckBox
Dim isChecked As Boolean = False
If showCheckbox.HasValue Then
isChecked = CType(node.ShowCheckBox, Boolean) And node.Checked
'If isChecked Then
' System.Diagnostics.Debug.Write("X")
'End If
End If
list.Add(isChecked)
If node.ChildNodes.Count > 0 Then
SaveTreeViewCheckedState(node.ChildNodes, list)
End If
Next
End Sub
Public Sub RestoreTreeView(ByVal treeView As TreeView, ByVal key As String)
Dim listExpanded As New List(Of Nullable(Of Boolean))
Dim listChecked As New List(Of Nullable(Of Boolean))
If HttpContext.Current.Session("1" + key + treeView.ID) IsNot Nothing Then
listExpanded = CType(HttpContext.Current.Session("1" + key + treeView.ID), List(Of Nullable(Of Boolean)))
listChecked = CType(HttpContext.Current.Session("2" + key + treeView.ID), List(Of Nullable(Of Boolean)))
End If
RestoreTreeViewIndex = 0
RestoreTreeViewExpandedState(treeView.Nodes, listExpanded)
RestoreTreeViewIndex = 0
RestoreTreeViewCheckedState(treeView.Nodes, listChecked)
End Sub
Private Sub RestoreTreeViewExpandedState(ByVal nodes As TreeNodeCollection, ByVal list As List(Of Nullable(Of Boolean)))
For Each node As TreeNode In nodes
If RestoreTreeViewIndex >= list.Count Then Exit Sub
node.Expanded = list(RestoreTreeViewIndex)
RestoreTreeViewIndex += 1
If node.ChildNodes.Count > 0 Then
RestoreTreeViewExpandedState(node.ChildNodes, list)
End If
Next
End Sub
Private Sub RestoreTreeViewCheckedState(ByVal nodes As TreeNodeCollection, ByVal list As List(Of Nullable(Of Boolean)))
For Each node As TreeNode In nodes
If RestoreTreeViewIndex >= list.Count Then Exit Sub
node.Checked = list(RestoreTreeViewIndex)
'If node.Checked Then
' System.Diagnostics.Debug.Write("X")
'End If
RestoreTreeViewIndex += 1
If node.ChildNodes.Count > 0 Then
RestoreTreeViewCheckedState(node.ChildNodes, list)
End If
Next
End Sub
End Class
C# CODE:
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System.Collections.Generic;
public class TreeViewState
{
private int RestoreTreeViewIndex;
public void SaveTreeView(TreeView treeView, string key)
{
List<Nullable<bool>> listExpanded = new List<Nullable<bool>>();
List<Nullable<bool>> listChecked = new List<Nullable<bool>>();
SaveTreeViewExpandedState(treeView.Nodes, listExpanded);
SaveTreeViewCheckedState(treeView.Nodes, listChecked);
HttpContext.Current.Session("1" + key + treeView.ID) = listExpanded;
HttpContext.Current.Session("2" + key + treeView.ID) = listChecked;
}
private void SaveTreeViewExpandedState(TreeNodeCollection nodes, List<Nullable<bool>> list)
{
foreach (TreeNode node in nodes) {
list.Add(node.Expanded);
if (node.ChildNodes.Count > 0) {
SaveTreeViewExpandedState(node.ChildNodes, list);
}
}
}
private void SaveTreeViewCheckedState(TreeNodeCollection nodes, List<Nullable<bool>> list)
{
foreach (TreeNode node in nodes) {
Nullable<bool> showCheckbox = node.ShowCheckBox;
bool isChecked = false;
if (showCheckbox.HasValue) {
isChecked = (bool)node.ShowCheckBox & node.Checked;
}
//If isChecked Then
// System.Diagnostics.Debug.Write("X")
//End If
list.Add(isChecked);
if (node.ChildNodes.Count > 0) {
SaveTreeViewCheckedState(node.ChildNodes, list);
}
}
}
public void RestoreTreeView(TreeView treeView, string key)
{
List<Nullable<bool>> listExpanded = new List<Nullable<bool>>();
List<Nullable<bool>> listChecked = new List<Nullable<bool>>();
if (HttpContext.Current.Session("1" + key + treeView.ID) != null) {
listExpanded = (List<Nullable<bool>>)HttpContext.Current.Session("1" + key + treeView.ID);
listChecked = (List<Nullable<bool>>)HttpContext.Current.Session("2" + key + treeView.ID);
}
RestoreTreeViewIndex = 0;
RestoreTreeViewExpandedState(treeView.Nodes, listExpanded);
RestoreTreeViewIndex = 0;
RestoreTreeViewCheckedState(treeView.Nodes, listChecked);
}
private void RestoreTreeViewExpandedState(TreeNodeCollection nodes, List<Nullable<bool>> list)
{
foreach (TreeNode node in nodes) {
if (RestoreTreeViewIndex >= list.Count) return;
node.Expanded = list(RestoreTreeViewIndex);
RestoreTreeViewIndex += 1;
if (node.ChildNodes.Count > 0) {
RestoreTreeViewExpandedState(node.ChildNodes, list);
}
}
}
private void RestoreTreeViewCheckedState(TreeNodeCollection nodes, List<Nullable<bool>> list)
{
foreach (TreeNode node in nodes) {
if (RestoreTreeViewIndex >= list.Count) return;
node.Checked = list(RestoreTreeViewIndex);
//If node.Checked Then
// System.Diagnostics.Debug.Write("X")
//End If
RestoreTreeViewIndex += 1;
if (node.ChildNodes.Count > 0) {
RestoreTreeViewCheckedState(node.ChildNodes, list);
}
}
}
}
Reference Information:
http://blog.binaryocean.com/2006/01/19/SaveTreeViewNodesExpansionCollapseStateCSAndVB.aspx