none
Menu sous asp.net : comment conserver l'état (expanded ou colapsed) de chaque noeud ? RRS feed

  • Question

  • Bonjour.

    Dans une page asp.net, un menu peut être généré automatiquement à partir du fichier Web.sitemap avec un contrôle asp:Menu ou asp:TreeView. De manière différente, ces deux contrôles permettent à l'utilisateur d'ouvrir ou de fermer des noeuds.

    Question : comment sur la page suivante réafficher le même menu avec la même configuration de noeuds ouverts et fermés ? J'ai essayé en utilisant les événements TreeNodeCollapsed et TreeNodeExpanded d'un contrôle asp:TreeView,  mais sans succès. Il semble que ces événements captent bien les changements faits dans mon programme, mais pas celui généré par un clic de souris sur le signe + ou -. D'ailleurs, dès que les Sub liées à ces événements sont présentes dans le code, un clic sur le + n'a plus aucun effet à l'écran!

    Merci de votre aide,

    Gilbert

    • Déplacé nikhoModerator jeudi 9 juin 2011 13:44 question asp.net uniquement (Origine :Visual Basic)
    jeudi 9 juin 2011 12:35

Réponses

  • Bonjour,

    ce lien pourrait vous être utile : Save TreeView Nodes Expansion / Collapse State (CS and VB)

    Cordialement

    vendredi 10 juin 2011 08:13
    Modérateur
  • Bonjour Ciprian.

    Je comprends ton impatience à recevoir un retour, et à marquer des contributions comme étant des réponses, mais cela peut parfois prendre du temps d'appliquer les conseils reçus, parmi toutes les autres tâches prévues ou non...

    Donc oui, le lien a été utile. Cependant, lorsque le TreeView est conçu pour afficher le menu, on ne peut plus le lier à une SiteMapDataSource, il est nécessaire de le charger explicitement :

    <asp:SiteMapDataSource ID="Smds" runat="server" ShowStartingNode="False" StartFromCurrentNode="False" />
    
    <asp:TreeView ID="TvMenu" runat="server" />
    
      Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
          ' Garnir le TreeView menu
          '  (Ce code est basé sur un post de Sridhar du 29-6-2008 :
          '  http://sridharu.blogspot.com/2008/06/how-to-read-quicklaunch-menu-items.html)
          For Each NoeudEnfantIn As SiteMapNode In Smds.Provider.RootNode.ChildNodes
            Dim NoeudRacineMenu = New TreeNode(NoeudEnfantIn.Title, NoeudEnfantIn.Url)
            NoeudRacineMenu.ToolTip = NoeudEnfantIn.Description
            TvMenu.Nodes.Add(NoeudRacineMenu)
            Call GarnirMenuTreeView(NoeudEnfantIn, NoeudRacineMenu)
          Next
    
          ' Restaurer l'apparence du TreeView
          TvMenu.CollapseAll()
          TreeViewState.RestoreTreeView(TvMenu, Me.GetType.ToString())
        End If
      End Sub
    
      Private Sub GarnirMenuTreeView(ByVal nIn As SiteMapNode, ByVal nOut As TreeNode)
        For Each NoeudEnfantIn As SiteMapNode In nIn.ChildNodes
          With NoeudEnfantIn
            Dim NoeudEnfantOut As New TreeNode(.Title, .Url)
            NoeudEnfantOut.ToolTip = .Description
            nOut.ChildNodes.Add(NoeudEnfantOut)
            Call GarnirMenuTreeView(NoeudEnfantIn, NoeudEnfantOut)
          End With
        Next
      End Sub
    
      Protected Sub TvMenu_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TvMenu.SelectedNodeChanged
        If Not TvMenu.SelectedNode.Value = String.Empty Then
          Response.Redirect(TvMenu.SelectedNode.Value)
        End If
      End Sub
    
      Protected Sub TvMenu_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles TvMenu.Unload
        ' Sauvegarder l'apparence du TreeView
        TreeViewState.SaveTreeView(TvMenu, Me.GetType.ToString())
      End Sub
    
    

    Le reste du code peut être retrouvé dans le post cité ci-dessus. Ajoutez cependant un Shared où besoin.

    Notez aussi qu'il faut EnableViewState="True" sur la page maître.

    Merci à Nikho pour cette piste.

    Gilbert

    jeudi 16 juin 2011 12:04

Toutes les réponses

  • Si votre arbre est commun à plusieurs pages ne pourriez vous pas le placer sur la master page ? cela vous évitera de devoir remettre à jour l'état de l'arbre.

    Sinon vous pouvez conserver l'état noeud par noeud lors d'un postback en utilisant l'évènement OnSelectedNodeChanged sur le treeview, ou bien peut être envisager d'accéder à l'arbre via cross page posting

    Cordialement

    jeudi 9 juin 2011 14:05
    Modérateur
  • Bonjour Nikho.

    Mon TreeView se trouve bien dans la page maître. Mais même avec EnableViewState=True, son affichage développe systématiquement tous les noeuds, quels que soient ceux que l'utilisateur a fermé.

    Je vais essayer tes autres pistes demain.

    Bonne soirée,

    Gilbert

    jeudi 9 juin 2011 15:15
  • Bonjour,

    ce lien pourrait vous être utile : Save TreeView Nodes Expansion / Collapse State (CS and VB)

    Cordialement

    vendredi 10 juin 2011 08:13
    Modérateur
  • Bonjour, Gilbert,

    Est-ce que le lien de Nikho vous a aidé à résoudre votre problème ? Merci pour partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 14 juin 2011 06:33
  • Bonjour Ciprian.

    Je comprends ton impatience à recevoir un retour, et à marquer des contributions comme étant des réponses, mais cela peut parfois prendre du temps d'appliquer les conseils reçus, parmi toutes les autres tâches prévues ou non...

    Donc oui, le lien a été utile. Cependant, lorsque le TreeView est conçu pour afficher le menu, on ne peut plus le lier à une SiteMapDataSource, il est nécessaire de le charger explicitement :

    <asp:SiteMapDataSource ID="Smds" runat="server" ShowStartingNode="False" StartFromCurrentNode="False" />
    
    <asp:TreeView ID="TvMenu" runat="server" />
    
      Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
          ' Garnir le TreeView menu
          '  (Ce code est basé sur un post de Sridhar du 29-6-2008 :
          '  http://sridharu.blogspot.com/2008/06/how-to-read-quicklaunch-menu-items.html)
          For Each NoeudEnfantIn As SiteMapNode In Smds.Provider.RootNode.ChildNodes
            Dim NoeudRacineMenu = New TreeNode(NoeudEnfantIn.Title, NoeudEnfantIn.Url)
            NoeudRacineMenu.ToolTip = NoeudEnfantIn.Description
            TvMenu.Nodes.Add(NoeudRacineMenu)
            Call GarnirMenuTreeView(NoeudEnfantIn, NoeudRacineMenu)
          Next
    
          ' Restaurer l'apparence du TreeView
          TvMenu.CollapseAll()
          TreeViewState.RestoreTreeView(TvMenu, Me.GetType.ToString())
        End If
      End Sub
    
      Private Sub GarnirMenuTreeView(ByVal nIn As SiteMapNode, ByVal nOut As TreeNode)
        For Each NoeudEnfantIn As SiteMapNode In nIn.ChildNodes
          With NoeudEnfantIn
            Dim NoeudEnfantOut As New TreeNode(.Title, .Url)
            NoeudEnfantOut.ToolTip = .Description
            nOut.ChildNodes.Add(NoeudEnfantOut)
            Call GarnirMenuTreeView(NoeudEnfantIn, NoeudEnfantOut)
          End With
        Next
      End Sub
    
      Protected Sub TvMenu_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TvMenu.SelectedNodeChanged
        If Not TvMenu.SelectedNode.Value = String.Empty Then
          Response.Redirect(TvMenu.SelectedNode.Value)
        End If
      End Sub
    
      Protected Sub TvMenu_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles TvMenu.Unload
        ' Sauvegarder l'apparence du TreeView
        TreeViewState.SaveTreeView(TvMenu, Me.GetType.ToString())
      End Sub
    
    

    Le reste du code peut être retrouvé dans le post cité ci-dessus. Ajoutez cependant un Shared où besoin.

    Notez aussi qu'il faut EnableViewState="True" sur la page maître.

    Merci à Nikho pour cette piste.

    Gilbert

    jeudi 16 juin 2011 12:04
  • Bonjour, Gilbert,

    Je suis d’accord avec vous qu’appliquer une solution proposée peut prendre beaucoup du temps, mais quand on ne reçoit du feedback pour plusieurs jours on va marquer la réponse ou transformer le thread en discussion, si aucune solution viable n’a été donnée. Par contre, quand l’utilisateur revient avec la confirmation de la solution ou avec d’autres questions sur le sujet il a la possibilité de changer le thread dans une question ou marquer/démarquer les solutions. Dans ce cas, je marquerai aussi votre dernier message comme réponse, vu qu’il complète la réponse de Nikho.

    Merci pour votre compréhension !

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 21 juin 2011 11:18