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 :

LinkButtons dynamiques, OnCLick, Page_Load et Viewstate


Sujet :

ASP.NET

  1. #1
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut LinkButtons dynamiques, OnCLick, Page_Load et Viewstate
    Bonjour !

    Je suis actuellement en train de développer une sorte de planning. La page se compose en gros d'une BulletedList (avec DisplayMode="LinkButton") mise en forme pour ressembler à des onglets, qui me permet de choisir une date (7 jours affichés + semaine suivante/précédente), et d'un contrôle Table pour afficher le planning à proprement parler.

    J'ai créé des propriétés (qui tapent dans le ViewState) me permettant de connaître la date sélectionnée, et des fonctions pour remplir ma table (loadTable()) et mettre à jour les onglets (initOnglets()).

    Dans mon page_load, j'appelle ces deux fonctions, postback ou non (normal, il faut les recréer à chaque postback)

    L'évènement OnClick de la BulletedList se contente de mettre à jour l'affichage des onglets selon le lien sur lequel on a cliqué.

    Seulement, dans ma table chaque case doit être cliquable, j'ai donc créé des linkButton depuis mon codeBehind dans la fonction de création de la table :

    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
    27
    protected void loadTable()
    {
    // ... 
     
    // Dans une boucle
     
     tr = new TableRow();
    td = new TableCell();
    td.Text = reader.GetString(1);
    td.CssClass = "terrain_case";
    tr.Cells.Add(td);
     
    for (int i = 8; i < 22; i++)
    {
        td = new TableCell();
        td.CssClass = "dispo_case"; // On met tout en dispo par défaut
        td.Controls.Add(new LinkButton());
        ((LinkButton)td.Controls[0]).Text = "<img src=\"" + ResolveClientUrl("~/Resources/images/icon_accept.gif") + "\" alt=\"Libre\"/>";
        ((LinkButton)td.Controls[0]).Attributes.Add("class", "tab_resa_lien");
        ((LinkButton)td.Controls[0]).Click += new System.EventHandler(this.resa_Click);
        tr.Cells.Add(td);
    }
     
    tblDispos.Rows.Add(tr);
     
    //...
    }
    Bon, jusque là tout va bien. J'aurais bien utilisé un repeater mais j'ai d'autres traitements compliqués à exécuter après pour que l'affichage soit ok.
    Toutes mes fonctions marchent bien dans leur coin, mais quand je mets tout ensemble j'ai un léger problème, c'est à dire que parfois je dois cliquer deux fois pour que mon tableau soit mis à jour.
    Après débug et grattage de crâne, j'en suis venu à la conclusion que, le page_load s'exécutant avant mes évènements, celui-ci remplit bien ma table, mais avec les valeurs d'avant le clic. Quand l'évènement click est traité, les paramètres stockés dans le ViewState sont changées, mais comme l'affichage est déjà effectué, ce n'est pas pris en compte.

    Je cherche sur le net depuis hier mais je n'ai pas encore réussi à régler le problème :/

    Comment puis-je faire ?

    Merci !

  2. #2
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut
    Ok c'est bon, il fallait mettre ma fonction loadTable, qui crée les linkbutton dynamiquement, dans le page_init, et là seulement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected void Page_Init(Object sender, EventArgs e)
    {
      loadTable();
    }

  3. #3
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 194
    Par défaut
    En fait non, pas exactement, j'ai dû faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected void Page_Init(Object sender, EventArgs e)
    {
       if(GetPostBackControl() != bllJours)
           loadTable();
    }
    La fonction GetPostBackControl étant :

    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
    /// <summary>
    /// Renvoie le contrôle qui a causé le postback.
    /// </summary>
    /// <param name="page">La page concernée par le Postback</param>
    /// <returns>Le contrôle qui a causé le Postback (null si non trouvé).</returns>
    public Control GetPostBackControl()
    {
        string eventTarget = Request.Params["__EVENTTARGET"];
        if (!string.IsNullOrEmpty(eventTarget))
        {
            return FindControl(eventTarget);
        }
        else
        {
            // If __EVENTTARGET is null, the postback control is a button type. Use LINQ
            // to query the Request's form variables order to find the button control.
            var postbackButton = (from x in Request.Form.AllKeys
                                  where FindControl(x) is Button || FindControl(x.Substring(0, x.Length - 2)) is ImageButton
                                  select (x.EndsWith(".x") ? x.Substring(0, x.Length - 2) : (x.EndsWith(".y") ? x.Substring(0, x.Length - 2) : x))).FirstOrDefault();
     
            return (!string.IsNullOrEmpty(postbackButton) ? FindControl(postbackButton) : null);
        }
    }
    Et pour mon évènement de clic sur la BulletedList (=on change de jour) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected void bllJours_Click(object sender, BulletedListEventArgs e)
    {
        switch (e.Index)
        {
           // Traitements
        }
     
        initOnglets();
        loadTable();
    }
    J'ai été obligé de mettre loadtable() à la fin de mon évènement pour charger les données de la bonne date, et le test dans le page_init sert à ne pas charger la table deux fois (ce qui, en plus d'être inutile, fait n'importe quoi avec les id des linkbuttons dynamiques).
    Ouf.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2009, 09h44
  2. HTML dynamique onclick
    Par Patgra37 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/06/2009, 16h35
  3. AddHandler sur LinkButton dynamique
    Par calagan99 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/07/2008, 13h56
  4. LinkButton dynamique et evenement click
    Par Ghunter59 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/04/2008, 14h30
  5. Ajout dynamique onclick et auto-execution
    Par chjerome dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/01/2008, 18h50

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