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 :

CheckBoxList: mes valeurs se réinitialisent avant l'affichage


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Par défaut CheckBoxList: mes valeurs se réinitialisent avant l'affichage
    Bonjour,

    j'ai un repeater dans lequel se trouve une CheckBoxList (ckbSpecialities) qui, comme son nom l'indique, contient des spécialités...
    Dans le Page_Load de ma page, je lis les spécialités d'un individu. Le but est de ne cocher dans ma CheckBoxList que les spécialités de l'individu parmi toutes celles affichées dans ma CheckBoxList.
    Le problème, c'est qu'après avoir bien coché toutes mes spécialités dans mon Checkbox (via une boucle et la commande listItem.Selected = true), dans ma page finale, aucun item n'est sélectionné... lors du débuggage, je constate que mes listItem qui doivent être cochés sont bel et bien modifiés, leur attrribut Selected = true, par contre, plus tard, tous les items de ma CheckBoxList sont comme réinitialisés...

    Voici le déroulement observé grâce au débugger:

    1)Page_Load
    RepeaterFunctions.DataBind(); (J'appelle la construction de mon repeater)
    2)RepeaterFunctions_ItemCreated
    ckbSpecialities.DataBind(); (J'appelle la construction de ma fameuse CheckBoxList, je la remplis de toutes les spécialités possibles)
    3)ckbSpecialities_DataBinding
    4)ckbSpecialities_DataBound
    5)retour dans RepeaterFunctions_ItemCreated()
    C'est ici que je boucle et que je sélectionne les items qui doivent l'être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach (ListItem listItem in ckbSpecialities.Items)
    {
      if (listItem.Value == speciality.SpecialityCode)
      {
        listItem.Selected = true;
      }
    }
    à ce stade, je vois clairement que les bons items sont bien sélectionnés: leur valeur Selected est à true...

    Ensuite, c'est là que ça se gâte: d'autres fonctions sont exécutées:

    6)ckbSpecialities_Init
    7)ckbSpecialities_DataBinding
    Ici, mes items ont encore les valeurs que j'attend
    8)ckbSpecialities_DataBound
    Ici, dans le débugger, je constate que mes items sont resettés...
    9)retour dans RepeaterFunctions_ItemCreated()
    10)retour dans Page_Load()

    Je ne sais pas pourquoi La fonction ckbSpecialities_Init et les autres sont appellées mais de toute évidence, quelque chose dans le cycle de ma page ne tourne pas rond!

    Un immense merci d'avance pour vos réponses ;-)

  2. #2
    Membre Expert Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Par défaut
    si tes composants sont liés aux données d'une base via OBjectdatasource ou Sql DataSourc, tu n'a spas besoin d'appeler la fonction DataBind()

    c'est justement là ton erreur..

    là fonction ckbSpecialities_DataBound est appelée plusieurs fois (inutilement).. et ton code que tu nous montre doit se trouver à cet endroit précisément..

  3. #3
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Par défaut
    Je n'ai pas directement lié tous mes contrôles à ma base de donnée.
    J'ai un singleton qui sert de tampon et qui fournit les dataTables qui changent rarement (et mon singleton se rafraîchit toutes les 24 heures). Du coup, pour binder mon checkboxlist avec sa table, je fais ça en code manuellement:
    Dans mon repeater (à l'étape 2)RepeaterFunctions_ItemCreated) , je retrouve le checkbox de l'item courant et je le bind:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CheckBoxList ckbSpecialities = e.Item.FindControl("ckbSpecialities") as CheckBoxList;
    if (ckbSpecialities != null)
    {
      ckbSpecialities.DataSource = _dtSpecialities;
      ckbSpecialities.DataValueField = "ID";
      ckbSpecialities.DataTextField = "Label";
      ckbSpecialities.DataBind();
    }
    Bien entendu, je n'appelle manuellement ckbSpecialities.DataBind(); qu'une seule fois dans ma page ... et avant de cocher mes items! ;-)

  4. #4
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Par défaut
    Personne n'a d'idée? :-(

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Essai peut etre sur la methode "OnItemDataBound" du repeater.

    Sur le ItemCreated tu es surement trop tot ce qui a pour consequence d' effectué l'init de ta CheckBoxList apres ton passage.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Par défaut Ca marche! Merci gyzmau
    Bon, comment dire gyzmau... euh... merci, merci et merci!

    Je n'y aurais jamais pensé! Je ne savais même pas qu'il y avait 2 fonctions à ce stade... et encore moins que l'une pouvait flinguer le travail de l'autre (en gros)...

    Il faut vraiment que je prenne le temps de me pencher sur le cycle de vie en ASP.NET...!

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

Discussions similaires

  1. Insérer une valeur dans value avant envoi du formulaire
    Par delma dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/02/2008, 15h07
  2. Attendre que tous mes invoke soient finis avant de fermer ma fenêtre
    Par Rodrigue dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 20/02/2008, 20h14
  3. Récuperer des données dans Repeater avant l'affichage
    Par Pedro Varela dans le forum ASP.NET
    Réponses: 1
    Dernier message: 14/08/2007, 12h47
  4. Recherche de valeur dans une feuille et affichage dans une autre
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/05/2007, 09h40
  5. Réponses: 2
    Dernier message: 15/06/2005, 15h57

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