none
[ASP.Net] DataTable qui perd ses données apres un évènement RRS feed

  • Question

  • Bonjour,

    J'ai crée une page qui permet la visualisation de donnée via une DataList.
    Cela se deroule en 3 étapes:
    1ere, selection du champ de recherche.
    2e affichage de la DataList via un bloc <div> qui etait visible=false
    3e affichage du contenu d'un eneregristrement via un bloc <div> qui etait visible=false

    on ne peut passer de la 1ere a la 3e étape!!!!

    et tout est sous forme d'évènement.

    lorsque je passe de la 1ere a la 2e étape, je charge une DataTable (attribut de la classe) pour l'affichage de ma DataList.
    et lorsque je passe de la 2e a la 3e étape, j'aimerai réutiliser les éléments contenus dans cette meme DataTable, hors celle-ci passe a null.

    La question est est-ce normal, sachant que c'est une variable de classe (avec Property)?
    suis obliger dans ce cas de mettre le contenu de cette DataTable dans une variable de session?

    merki
    jeudi 6 décembre 2007 08:15

Réponses

  • Bonjour,

    Effectivement c'est normal que lors du 2ème évènement votre DataTable valle null car à chaque appel au serveur, celui recrée une instance de votre classe.

    Si vous ne voulez pas recharger vos données, vous avez plusieurs solutions :

    1. Utiliser la session (déconseiller, risque de problème de performance et partage de session entre fenètre).
    2. Utiliser le cache avec une durée de vie en fonction de vos données. Si la données ne sont pas dans le cache, vous les chargez (cas lors du premier évènement) et les mettez dedans. Lors du 2ème appel les données seront peut être encore en cache (dépendant de la durée de vie et du temps qu'aura mis l'utilisateur pour faire l'action). Avantage vos données sont partagées entre vos utilisateurs.
    3. Utiliser le ViewState, les données de votre DataTable seront encodées dans le ViewState qui sera envoyé au client et que vous retrouverez lors de sont prochain appel. A n'utiliser que si vous n'avez pas trop de données sinon la taille de la page sera trop grande et ralentira votre page.

    Si vos données peuvent être partagé entre vos utilisateur je vous conseillerai la méthode 2 (cache) en utilisant un propriété :

     

    Extrait de code

    public DataTable MyData

    {

    get

    {

    object obj = this.Cache["MyData"];

    if (null == obj)

    {

    // récupérez vos données

    obj = ....

     

    this.Cache.Add("MyData", obj, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);

    }

     

    return obj as DataTable;

    }

    }

     

     

    Si vous voulez utiliser le ViewState, une propriété presque identique à la précédente peut être utilisé :

     

    Extrait de code

    public DataTable MyData

    {

    get

    {

    object obj = this.ViewState["MyData"];

    if (null == obj)

    {

    // récupérez vos données

    obj = ....

     

    this.ViewState["MyDate"] = obj;

    }

     

    return obj as DataTable;

    }

    }

     

     

    Guillaume
    jeudi 6 décembre 2007 10:03

Toutes les réponses

  • Bonjour,

    Effectivement c'est normal que lors du 2ème évènement votre DataTable valle null car à chaque appel au serveur, celui recrée une instance de votre classe.

    Si vous ne voulez pas recharger vos données, vous avez plusieurs solutions :

    1. Utiliser la session (déconseiller, risque de problème de performance et partage de session entre fenètre).
    2. Utiliser le cache avec une durée de vie en fonction de vos données. Si la données ne sont pas dans le cache, vous les chargez (cas lors du premier évènement) et les mettez dedans. Lors du 2ème appel les données seront peut être encore en cache (dépendant de la durée de vie et du temps qu'aura mis l'utilisateur pour faire l'action). Avantage vos données sont partagées entre vos utilisateurs.
    3. Utiliser le ViewState, les données de votre DataTable seront encodées dans le ViewState qui sera envoyé au client et que vous retrouverez lors de sont prochain appel. A n'utiliser que si vous n'avez pas trop de données sinon la taille de la page sera trop grande et ralentira votre page.

    Si vos données peuvent être partagé entre vos utilisateur je vous conseillerai la méthode 2 (cache) en utilisant un propriété :

     

    Extrait de code

    public DataTable MyData

    {

    get

    {

    object obj = this.Cache["MyData"];

    if (null == obj)

    {

    // récupérez vos données

    obj = ....

     

    this.Cache.Add("MyData", obj, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);

    }

     

    return obj as DataTable;

    }

    }

     

     

    Si vous voulez utiliser le ViewState, une propriété presque identique à la précédente peut être utilisé :

     

    Extrait de code

    public DataTable MyData

    {

    get

    {

    object obj = this.ViewState["MyData"];

    if (null == obj)

    {

    // récupérez vos données

    obj = ....

     

    this.ViewState["MyDate"] = obj;

    }

     

    return obj as DataTable;

    }

    }

     

     

    Guillaume
    jeudi 6 décembre 2007 10:03
  • Merci pour cette réponse Big Smile

    je vais utiliser les 2 dernieres methodes:
    la 2e pour la mise en cache de l'objet de connection avec la base Active directory (qui pourra etre partagé)
    la 3e pour les résultats des recherches personnelles dans la base.

    merki
    jeudi 6 décembre 2007 10:11
  • slt.

    j'espère que tu te rappelles de moi(tu m'as aidé il n'y a pas longtemps dans un autre forum pour l'authentification).

    je voulais te saluer et te remercier par ce que tu nous aide beaucoup et je te trouve partout.

     

    merci

     

    vendredi 2 mai 2008 23:16