IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Perte de toutes variables à chaque rechargement du cycle de vie de la page


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut Perte de toutes variables à chaque rechargement du cycle de vie de la page
    Bonjour,

    Donc j'ai fait un titre assez long pour être assez explicite, toutefois, je vais tenter de détaillé un peu. ^o^

    1. Obtention des données :
      A l'intérieur de mon Page_Load, j'effectue mon appel aux données qui sont stockés dans un DataSet que je copie à ma GridView (puis bind). Si vous souhaitez le code, je peux vous le fournir, mais normalement, je ne pense pas que l'erreur se trouve ici.

    2. Actions possibles :
      • Changement de page :
        Le changement de page est un peu plus compliqué que normal, puisque l'appel aux données est dynamique (ou quelque chose du genre :p désolé pour les puristes :s ) donc il m'a fallu rajouté cette fonction, puis tout marche nickel.
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        Protected Sub Gridview1_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
            GridView1.PageIndex = e.NewPageIndex
            GridView1.DataBind()
        End Sub
      • Trié les données :

    C'est là qu'arrive les problèmes, donc après 2 jours de recherche, j'ai bien reussi à trié la colonne que je souhaite dans l'intégralité de ma GridView (et non seulement les 10 lignes affichées par la GridView) et lorsque l'on demande l'évènement Sorting en cliquant sur le nom de la colonne, tout se fait bien, par exemple, si on le fait à la page 2, il n'affichera pas les premiers éléments triés, mais bien ceux qui doivent se trouver à la page 2 (triés !).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Protected Sub GridView1_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles ..
        If GridView1.DataSourceToString() = "System.Data.DataSet" Then
            Dim ds As DataSet = GridView1.DataSource
            Dim dv As New DataView(ds.Tables(0))
            dv.Sort = e.SortExpression + " " + ConvertSortDirection(e.SortDirection)
            GridView1.DataSource = dv
            GridView1.DataBind()
        Else
            Dim dv As DataView = GridView1.DataSource
            dv.Sort = e.SortExpression + " " + ConvertSortDirection(e.SortDirection)
            GridView1.DataSource = dv
            GridView1.DataBind()
        End If
    End Sub
     
    Protected Function ConvertSortDirection(ByVal sortDirection As SortDirection)
        Dim newSortDirection As String = String.Empty
        Select Case sortDirection
            Case sortDirection.Ascending
                newSortDirection = "ASC"
            Case sortDirection.Descending
                newSortDirection = "DESC"
        End Select
        Return newSortDirection
    End Function
    Voilà mon code.
    Le seul problème c'est qu'à chaque changement de page, on trouve une GridView à la bonne page mais elle n'est plus trié, elle est comme on l'a demandé avant triage.

    En regardant avec le débuggeur, j'ai pu m'apercevoir qu'en fait, on recharge la GridView dans le Page_Load et que donc, l'évènement Sorting est perdu.
    Le problème est que dès qu'un contrôle entraîne un PostBack (comme le contrôle sorting de la GridView) on perd la GridView, les variables mêmes globales...

    J'ai déjà essayé de me renseigné sur internet, et j'ai donc essayé un autre algo (la réponse). Quoique cet algo est beaucoup mieux que le mien puisqu'il gère le triage dans les deux sens, il me fait toujours la même chose au premier changement de page qui suit l'évènement Sorting : perte de toutes données, et donc du triage.
    De mon côté, j'ai essayé de mettre SortExpression et SortDirection dans des variables de session afin de trié après chaque remplissage de GridView1. Mais je n'y parviens pas, car il faut créer un GridViewSortEventArgs, ce que je n'arrive pas à faire (pour appeler directement la fonction GridView1_Sorting).

    Merci de votre patiente et de vos éventuelles réponses.

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Je comprends pas trop. Si tu stockes la SortExpression (Session, ViewState, peu importe), pourquoi ne la réutilises-tu pas dans ta fonction Gridview1_PageIndexChanging ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Comment ça ?

    Je suis nouveau en VB.NET, je découvre et j'apprend au fur et à mesure.

    Donc si je comprend bien, je dois reeffectué l'évènement Sorting dans ma fonction de changement de page ?

    Peux tu juste me montrer comme faire avec cette algo, je ne comprend pas trop les ViewState ... Seulement pour la fonction PageIndexChanging. [EDIT]De plus, tu n'as pas l'élément GridViewSortEventArgs dans le PageIndexChanging, donc je ne vois vraiment pas comment faire[/EDIT]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Protected Sub Gridview1_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
        GridView1.PageIndex = e.NewPageIndex
        GridView1.DataBind()
    End Sub
    [EDIT2]
    J'ai pensé à quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Protected Sub Gridview1_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
        SortGridView(... , GridViewSortDirection)
        GridView1.PageIndex = e.NewPageIndex
        GridView1.DataBind()
    End Sub
    Cela voudrais-t-il dire que je dois de nouveau crée une propriété pour SortExpression ??



    [FINALEDIT]
    J'ai finalement réussi a trouvé une solution qui fonctionne, toutefois, même si ce n'est pas du bidouillage, ça s'en approche.

    Pour ceux qui aurais le même problème :
    Pour les fonctions, regarder ici.

    J'ai crée une variable de session qui stocke le nom de la colonne et le sens de tri, à l'aide de la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Session("parametresSort") = sortExpression & "&ASC"
    PS : à remplacer par DESC pour l'autre cas
    Cette commande est à faire juste après l'appel de "SortGridView" effectué dans la fonction "GridView_Sorting".

    Puis dans la fonction de changement de page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Protected Sub Gridview1_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
        GridView1.PageIndex = e.NewPageIndex
        GridView1.DataBind()
     
        If Not IsNothing(Session("parametresSort") Then   ' Si on a déjà chercher à trie la GridView'
            Dim parametresSort as string = Session("parametresSort")
            Dim parametre(2) as string
            parametre = parametresSort.Split("&")
            SortGridView (parametre(0), parametre(1))
        End If
    End Sub

    Voilà, et merci Nicolas pour ta réponse, parce que j'ai trouvé grâce à ton indice.

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Toutefois, la solution reste très longue à charger pour les grosses GridView, ce qui n'est pas très agréable pour le confort de l'utilisateur qui souhaite accéder à ses données rapidement.

    Donc, si quelqu'un avais éventuellement une autre solution a testé, plus rapide, je serais preneur.

    Dans l'état actuel des choses, je compte tenté de sauvegardé la GridView dans une variable de session, et lié la variable de session à ma GridView dans le Page_Load.

    Si cela vous intéresse, n'hésitez pas à me demander le résultat.

  5. #5
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Pour optimiser le chargement de la page, mais aussi éviter les requêtes trop lourdes sur ta base de données, tu devrais utiliser la pagination.

    Attention je ne parle pas de la pagination de base avec une SQLDataSource qui va faire un select sur toutes les lignes puis t'afficher que les X premières lignes dans ta page GridView. Je parle d'une vraie pagination au niveau de la requête SQL où celle-ci te renverra uniquement les lignes désirées et non pas tout.

    Tu peux faire une recherche sur ce forum, ce sujet a été abordé pas mal de fois.

    En espérant t'avoir aidé.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Non, cela n'est pas possible, car le but est d'obtenir la totalité de ma requête pour que les employées puissent utilisé le site à leurs fins. ^^

    Finalement, j'ai repris l'ancien système, en testant je n'ai pas pu voir une grande différence de temps entre rappelé la GridView dans le Page_Load puis la retrié à chaque changement de page et la copie de la GridView trié que l'on charge dans le Page_Load une fois que la copie est crée.

    Toutefois, pour ceux que ça intéresse, cela marche bien, mais pour les GridView trop importantes, cela prend peut-être de la mémoire ...

    Il faut rajouté cette ligne à la fin de la fonction "SortGridView" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Session("BackUpGridView") = dv
    dv étant la DataView trié !

    Et rajouté dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If IsNothing(Session("BackUpGridView"))
        /* Chargement de la BDD (avec gestion d'erreur ...) */
        GridView1.DataBind()
    Else
        GridView1.DataSource = Session("BackUpGridView")
        GridView1.DataBind()
    End If
    Merci de tes réponses Nicolas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. perte variable au rechargement formulaire upload
    Par nicomax34 dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2011, 19h19
  2. Cycle de vie d'une page ASP
    Par hwoarang dans le forum ASP.NET
    Réponses: 5
    Dernier message: 12/10/2010, 17h24
  3. Réponses: 6
    Dernier message: 27/03/2010, 14h48
  4. Cycle de vie d'une page ASP corrompu
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 4
    Dernier message: 23/06/2009, 18h52
  5. Cycle de vie d'une page asp.net
    Par lazins dans le forum ASP.NET
    Réponses: 12
    Dernier message: 03/11/2008, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo