Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Daguis

[Resolvido] treeview

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.