Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal Boa Tarde,
Estou utilizando Visual Studio 2010 (Asp.Net com Vb.Net), MasterPage com uma TreeView, e crio as minhas telas (.aspx) herdando o layout da MasterPage.
O meu problema é o seguinte, quando o node da treeview for selecionado pelo usuário ("Collapsed/Expanded") direcionando à uma nova página ("NavigateURL") a Treeview não está mantendo o estado do ato da seleção, pois a master está recebendo um novo postback, carregando como se fosse uma nova página.
Por Exemplo, ao carregar a pagina, todos os nodes estão abertos, o usuario fecha alguns nodes, e seleciona um item, ao selecionar o item o treeview volta ao estado original, ou seja, com todos os nodes novamente aberto.
Tentei usar UpdatePanel para carregar somente o conteúdo da página "aspx" sem resultado. Alguma sugestão?
Desde ja agradeço.
Pessoal incrementei mais o código para salvar tambem os Nodes filhos e assim por diante.
Vou postar o código, caso alguem tenha alguma duvida sobre isso tambem no futuro.
Protected Sub SalvaEstadoTreeview()
Dim NodesStates As New Dictionary(Of String, Boolean)
Dim NodesChildStates As New Dictionary(Of String, Boolean)
For mCt = 0 To TreeView1.Nodes.Count - 1
If Not TreeView1.Nodes(mCt).Expanded Is Nothing Then
NodesStates.Add(TreeView1.Nodes(mCt).Value, TreeView1.Nodes(mCt).Expanded)
'Verifica o Node Pai tem nodes filhos '
If TreeView1.Nodes(mCt).ChildNodes.Count > 0 Then
For mct1 = 0 To TreeView1.Nodes(mCt).ChildNodes.Count - 1
'Verifica se o Node filho é tambem um Node Pai ( Count > 0, se for '
'tambem pode ser retraido e expandido, então vamos verificar o '
'estado do node filho que tambem é Node Pai '
If TreeView1.Nodes(mCt).ChildNodes(mct1).ChildNodes.Count > 0 Then
'Se o Node Filho que tambem é Node Pai não estiver expandido, '
'salvamos ele no dicionario NodesChildState, e quando for '
'carregar, apenas verificamos se o Node Filho que tambem é '
'node pai existe no dicionario, se existir, ele foi retraido '
If Not TreeView1.Nodes(mCt).ChildNodes(mct1).Expanded Then
NodesChildStates.Add(TreeView1.Nodes(mCt).ChildNodes(mct1).Value, TreeView1.Nodes(mCt).ChildNodes(mct1).Expanded)
End If
End If
Next
End If
End If
Next
'Salvamos nas sessões para ler-mos ao carregar '
Session("TreeState") = NodesStates
Session("TreeChildState") = NodesChildStates
End Sub
Protected Sub CarregaEstadoTreeview()
'Criamos os dicionarios '
Dim NodesStates As New Dictionary(Of String, Boolean)
Dim NodesChildStates As New Dictionary(Of String, Boolean)
'Verifica se foi salvo algo nele '
If Session("TreeState") Is Nothing Then
Exit Sub
End If
'Obtem os nodes com seus estados '
NodesStates = Session("TreeState")
NodesChildStates = Session("TreeChildState")
For mCt = 0 To TreeView1.Nodes.Count - 1
If NodesStates.ContainsKey(TreeView1.Nodes(mCt).Value) Then
If NodesStates(TreeView1.Nodes(mCt).Value) Then
TreeView1.Nodes(mCt).Expand()
'Verifica se o Node Pai tem node filhos '
If TreeView1.Nodes(mCt).ChildNodes.Count > 0 Then
'Faz um contador com a qtde de nodes filhos do node pai '
For mct1 = 0 To TreeView1.Nodes(mCt).ChildNodes.Count - 1
'Verifica se o Node Filho é tambem um Node Pai, se sim, então '
'verifica se o nome dele esta no dicionario, se estiver, é porque
'foi retraido, então vamos retrair para manter igual ao que o '
'usuario deixou '
If TreeView1.Nodes(mCt).ChildNodes(mct1).ChildNodes.Count > 0 Then
'Se conter aqui, é porque o cara retraiu o NodeChild, '
'logo vamos retrair aqui '
If NodesChildStates.ContainsKey(TreeView1.Nodes(mCt).ChildNodes(mct1).Value) Then
TreeView1.Nodes(mCt).ChildNodes(mct1).Collapse()
End If
End If
Next
End If
Else
TreeView1.Nodes(mCt).Collapse()
End If
End If
Next
End Sub
Private Sub TreeView1_TreeNodeCollapsed(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeCollapsed
SalvaEstadoTreeview()
End Sub
Private Sub TreeView1_TreeNodeExpanded(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeExpanded
SalvaEstadoTreeview()
End Sub
Pessoal encontrei a solução, segui esse site e deu certinho
http://www.vcskicks.com/treeview-state.php
Primeiro eu criei uma Sub que salva o estado dos nodes do treeview, gravando o estado numa sessão
Protected Sub SalvaEstadoTreeview()
Dim NodesStates As New Dictionary(Of String, Boolean)
For mCt = 0 To TreeView1.Nodes.Count - 1
If TreeView1.Nodes(mCt).ChildNodes.Count > 0 Then
NodesStates.Add(TreeView1.Nodes(mCt).Value, TreeView1.Nodes(mCt).Expanded)
End If
Next
Session("TreeState") = NodesStates
End Sub
Depois fiz uma outra sub que pega o estado dos nodes da treeview e carrega a treeview novamente
Protected Sub CarregaEstadoTreeview()
Dim NodesStates As New Dictionary(Of String, Boolean)
If Session("TreeState") Is Nothing Then
Exit Sub
End If
NodesStates = Session("TreeState")
For mCt = 0 To TreeView1.Nodes.Count - 1
If NodesStates.ContainsKey(TreeView1.Nodes(mCt).Value) Then
If NodesStates(TreeView1.Nodes(mCt).Value) Then
TreeView1.Nodes(mCt).Expand()
Else
TreeView1.Nodes(mCt).Collapse()
End If
End If
Next
End Sub
Feito isso, eu coloquei a Sub que salva o estado dos nodes do treeview nos eventos de Expandir e Retrair o treeview
Private Sub TreeView1_TreeNodeCollapsed(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeCollapsed
SalvaEstadoTreeview()
End Sub
Private Sub TreeView1_TreeNodeExpanded(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeExpanded
SalvaEstadoTreeview()
End Sub