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 :

[asp.net 2.0] Hashtable qui ne se remplit pas dans un if(!Page.IsPostBack)


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [graphicsxp] Hashtable reste désespérément vide
    Bonsoir à tous,

    J'ai une Hashtable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Hashtable ListeInterets = new Hashtable();
    Je la remplis au cours de la lecture d'un SQLDataReader de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (ListeCentresInteret.Read())
    {
    ListeInterets.Add(ListeCentresInteret["CodeInteret"].ToString(), ListeCentresInteret["LibelleInteret"].ToString());
    }
    Je suis sûr que ListeCentresInteret["CodeInteret"].ToString() et ListeCentresInteret["LibelleInteret"].ToString() retournent bien des valeurs (par exemple respectivement "7" et "Sport"), mais il se trouve que ma Hashtable n'est jamais remplie. CodeInteret est un n° de clef primaire (unique).

    Malgré un try/catch je n'ai pas non plus d'erreur lorsque je débugge.

    Merci à celui ou celle qui saura me dire ce que j'ai bien pu oublier...

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 219
    Points : 227
    Points
    227
    Par défaut strat0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (ListeCentresInteret.Read())
    {
    ListeInterets.Add(ListeCentresInteret["CodeInteret"].ToString(), ListeCentresInteret["LibelleInteret"].ToString());
    }
    Essaye de faire juste l'ajout d'une affaire sans ton while, car je crois que c'est ça qui cause problème.

    Tu serais surment mieux de prendre un genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(INT i = 0 ; i < ListeCentresInteret.Count; i++)
    {
    ...
    }
    Alexandre Berger
    (oublie pas le résolu)

  3. #3
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    J'ai essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeInterets.Add(1, "Actualité");
    ...en dehors du While, et ça ne change rien. La Hashtable ne se remplit absolument pas...

    Mais j'ai un début de piste. La Hashtable se remplit si je mets la même ligne que ci-dessus...

    ...avant if (!Page.IsPostBack). Car je remplis la Hashtable dans le Page_Load, au premier chargement de la page. Se pourrait-il que la Hashtable se vide à chaque chargement de la page?

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 219
    Points : 227
    Points
    227
    Par défaut Re-bonjour strat0
    Tout dépend où vous avez déclaré votre hastable. Si elle est privé ou public. Bref, je n'ai pas votre code sous les yeux...

    Alex

  5. #5
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    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
    public partial class _Default : System.Web.UI.Page
    {
        public string ShowTableErreur = "none";
        private Hashtable ListeInterets = new Hashtable();
     
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection ConnexionPTIEmailing = new SqlConnection();
            ConnexionPTIEmailing.ConnectionString = ConfigurationManager.ConnectionStrings["MaConnexion"].ToString();
     
            if (!Page.IsPostBack)
            {
                try
                {
                    //On va générer automatiquement le tableau présentant les centres d'intérêt
                    ConnexionPTIEmailing.Open();
                    SqlCommand CommandeListeCentresInteret = new SqlCommand("SELECT CodeInteret, LibelleInteret FROM Interets ORDER BY LibelleInteret", ConnexionPTIEmailing);
                    SqlDataReader ListeCentresInteret = CommandeListeCentresInteret.ExecuteReader();
     
                    while (ListeCentresInteret.Read())
                    {
                        //On récupère dans la Hashtable (variable globale) la liste des centres d'intérêt ainsi que leur clef primaire
                        ListeInterets.Add(ListeCentresInteret["CodeInteret"].ToString(), ListeCentresInteret["LibelleInteret"].ToString());
                    }
    Et ça donne ça.

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 219
    Points : 227
    Points
    227
    Par défaut Salut vincent web
    Place ta hashtable en paramètre de ton construction de cette page si (celle que tu m,as envoyé le code) et appelle le à partir de la page qui fait le chargement de celle-ci.

    Alex

  7. #7
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Citation Envoyé par alexandrebergercyr
    Place ta hashtable en paramètre de ton construction de cette page si (celle que tu m,as envoyé le code) et appelle le à partir de la page qui fait le chargement de celle-ci.

    Alex
    Je suis vraiment désolé, je n'ai strictement rien compris à ton message (pas plus qu'à son titre).

    Le code que j'ai posté plus haut et le lien vers la page sur mon IIS = la même page.

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 219
    Points : 227
    Points
    227
    Par défaut Mets ton hashtable dans ton page_load alors
    C'est tu assez clair?

    Alex

  9. #9
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Citation Envoyé par alexandrebergercyr
    C'est tu assez clair?

    Alex
    La déclaration de ma Hashtable? Je dois la garder en variable globale (private Hashtable) car je m'en sers plus loin lorsqu'on clique sur le bouton "Valider" de ma page, mais je souhaite la remplir au premier chargement de la page.

    Je me trompe ou tu as du mal à t'exprimer en français?

  10. #10
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [asp.net 2.0] Hashtable qui ne se remplit pas dans un if(!Page.IsPostBack)
    Bonjour à tous,

    Tout d'abord : oui je sais j'ai déjà posté sur le forum C# mais il s'avère finalement que le problème concerne plus spécifiquement l'ASP.NET.

    Voilà j'ai une Hashtable qui est déclarée comme variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Hashtable ListeInterets = new Hashtable();
    Ensuite elle est remplie dans mon Page_Load :
    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
    protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection ConnexionPTIEmailing = new SqlConnection();
            ConnexionPTIEmailing.ConnectionString = ConfigurationManager.ConnectionStrings["MaConnexion"].ToString();
     
            //if (!Page.IsPostBack)
            {
                try
                {
                    //On va générer automatiquement le tableau présentant les centres d'intérêt
                    ConnexionPTIEmailing.Open();
                    SqlCommand CommandeListeCentresInteret = new SqlCommand("SELECT CodeInteret, LibelleInteret FROM Interets ORDER BY LibelleInteret", ConnexionPTIEmailing);
                    SqlDataReader ListeCentresInteret = CommandeListeCentresInteret.ExecuteReader();
     
                    while (ListeCentresInteret.Read())
                    {
                        //On récupère dans la Hashtable (variable globale) la liste des centres d'intérêt ainsi que leur clef primaire
                        ListeInterets.Add(ListeCentresInteret["CodeInteret"].ToString(), ListeCentresInteret["LibelleInteret"].ToString());
     
    //Plus bas dans ce while --> Génération de la table des centres d'intérêt
    J'ai identifié de manière assez précise la source du problème. Si je laisse "if (!Page.IsPostBack)" en commentaire, la Hashtable se remplit bien, mais si j'enlève les "//" de commentaire, la Hashtable ne se remplit jamais (ListeCentresInteret["CodeInteret"] et ListeCentresInteret["LibelleInteret"] renvoient bien des valeurs, j'ai vérifié).

    Pourtant j'ai besoin que cette Hashtable se remplisse dans le page "if (!Page.IsPostBack)", sinon...

    ...Jetez un coup d'oeil ici, et inscrivez-vous avec l'email "thestrokes@hotmail.com" (le nom et le prénom importent peu). Vous voyez la table des centres d'intérêt qui se génère à nouveau à chaque rechargement? Le "if (!Page.IsPostBack)" c'est pour ça. Il faut que cette table se génère une seule fois à l'initialisation (et au passage que ça remplisse le Hashtable).

    Merci à ceux qui sauront m'aider.

  11. #11
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Bienvenue dans le monde du web . Alors, je t'explique:

    si tu fais une action dans un

    if(!Page.IsPostBack)....cette action ne se fera que lorsqu'aucune donnée n'est renvoyée en POST (via un bouton ou contrôle quelconque) sur ta page.

    Si tu mets quelque chose dans le page_load sans test, cela se fera à chaque coup.

    Ceci dit, une hashtable n'étant pas un WebControl, elle ne bénéficie pas du support du viewstate comme ceux-ci (label, textbox, dropdown etc...) c'est donc à toi de gérer ça "manuellement".

    Tu pourrais faire quelque chose comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Hashtable MyTable = Session["MyHashTable"] as Hashtable;
            if (MyTable == null)
            {
                MyTable = new Hashtable();
                for (int i = 0; i < 10; i++)
                {
                    MyTable[i] = "Item " + i;
                }
                Session["MyHashTable"] = MyTable;
            }
    Avec ce type de code, tu prends ce qui a été stocké en session si cet objet existe sinon tu le reconstruis. Note que si tu n'utilises cela que dans le cadre d'une page et qu'aucune donnée n'est confidentielle, tu peux aussi utiliser le viewstate au lieu de la session.

  12. #12
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Raaaah! Encore ce damné ViewState. Décidément il m'aura bien pourri la vie celui-là.

    Ce que j'ai compris, c'est qu'une Hashtable n'est pas un contrôle web et que c'est pour ça qu'elle ne se remplit pas.

    Je vais voir comment manipuler le ViewState. Merci beaucoup pour ton aide.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par strat0
    J'ai essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeInterets.Add(1, "Actualité");
    Que ce passe t'il en mode DEBUG ?
    Essaye de voir si ton hastable n'est pas en readonly, ou de taille fixe.

    Cette hashtable est initialisé a chaque load ?
    Si oui, crée ton hastable dans ton load.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private Hashtable listeInteret;
     
    protected void Page_Load(object sender, EventArgs e)
    {
       listeInteret = new Hashtable();
       listeInteret.Add("key", "value");
    }

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Si aucune exception n'est lancée dans ton code actuellement, ton hastable contient obligatoirement des données.
    Le problème doit a mon avis se situer dans l'exploitation de ton hashtable.

    Affiche les infos de ta hashtable a chaque fois que tu ajoutes une donnée dans ta boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(listeInteret["key"]);

  15. #15
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par strat0
    Raaaah! Encore ce damné ViewState. Décidément il m'aura bien pourri la vie celui-là.
    Il te rend pourtant un sacré service, sans le viewstate, tu devrais récupérer toutes tes valeurs manuellement, y compris pour les contrôles web

    Citation Envoyé par strat0
    Ce que j'ai compris, c'est qu'une Hashtable n'est pas un contrôle web et que c'est pour ça qu'elle ne se remplit pas.
    C'est tout à fait cela. Tu dois donc faire persister les données de ta hashtable soit en session soit via le viewstate.

  16. #16
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    Si tu as mis ta déclaration de ton hastable dans la page en question c'est tout a fait normal que tu n'es rien au rechargement de ta page ... vu que tout les objets sont réinitialisés.

    Pour corriger ce problème faut utiliser les sessions qui te permettent de transposter des objets d'une page à une autre sans pb ...

  17. #17
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    ou le viewstate la page sera un peu plus lourde mais au moins, c'est pas en mémoire. Tout dépend ce que tu veux faire

  18. #18
    Membre habitué Avatar de stephane.net
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 170
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    plutôt que de mettre ta table en Session tu peux manuellement la stocker dans le ViewState :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ViewState ["MyHashTable"] = MyTable;
     
    Hashtable MyTable = ViewState ["MyHashTable"] as Hashtable;


  19. #19
    Membre habitué Avatar de stephane.net
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 170
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par stephane eyskens
    Tu dois donc faire persister les données de ta hashtable soit en session soit via le viewstate.
    désolé je n'avais pas bien lu...

    je précise, que lorsque la donnée n'est liée qu'à la page elle-même je n'utilise pas la Session mais le ViewState

  20. #20
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Bonsoir,

    Finalement et après bien des difficultés je me suis basé sur ce que j'ai trouvé sur MSDN (version locale) et maintenant mon code ressemble à ça (je ne mets volontairement que ce qui concerne directement la Hashtable) :
    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
    26
    public partial class _Default : System.Web.UI.Page
    {
        private Hashtable ListeInterets = new Hashtable();
     
        protected void Page_Load(object sender, EventArgs e)
        {
            if (ViewState["ListeInteretsViewState"] != null)
            {
                ListeInterets = (Hashtable)ViewState["ListeInteretsViewState"];
            }
     
            if (!Page.IsPostBack)
            {
                Ici remplissage de la Hashtable ListeInterets.
            }
        }
     
        protected void Page_PreRender(object sender, EventArgs e)
        {
            ViewState.Add("ListeInteretsViewState", ListeInterets);
        }
     
        protected void ButtonValide_Click(object sender, EventArgs e)
        {
            Ici je me ressers de la Hashtable.
        }
    Voilà. Je ne sais pas si c'est la manière la plus propre d'implémenter le ViewState sur une Hashtable mais... ça fonctionne.

    Sinon Stéphane Eyskens, tu semblais dire qu'il valait mieux utiliser le ViewState que si les données n'étaient pas confidentielles. Mais en me renseignant j'ai vu qu'on pouvait activer une fonction de hachage ou de cryptage du ViewState. Pour info.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Page ASP.NET avec un lien qui pointe vers une requête HTTPS
    Par fterf dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/07/2014, 12h07
  2. Réponses: 0
    Dernier message: 06/02/2009, 20h20
  3. Réponses: 4
    Dernier message: 04/09/2007, 08h51
  4. Réponses: 4
    Dernier message: 27/06/2007, 09h13
  5. Réponses: 2
    Dernier message: 15/05/2007, 15h26

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