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 :

selectedValue de dropdownlist générées dynamiquement


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 19
    Par défaut selectedValue de dropdownlist générées dynamiquement
    Bonjour,

    je rencontre un problème avec une page ASP.NET. Cette page contient un placeHolder dans lequel j'insère dynamiquement des dropdownlist (3 par ligne et x lignes). J'ajoute ces dropdownlist dans le Page_Load SANS vérifier si l'on est dans le cas d'un postback sinon lors d'un postback je n'ai plus rien dans mon placeholder. Je ne change nul part la valeur sélectionnée.

    Le problème est le suivant: lorsque je clic sur le bouton de validation de la page, la page est rechargée (les dropdownlist sont donc réinsérées dans le placeholder) puis, lors du traitement de l'évènement du clic, les valeurs de certaines des dropdownlist n'ont pas été retenues. Pour être plus clair, la première ligne de dropdownlist a pour selectedValue la première valeur de la liste alors que toutes les autres dropdownlist récupèrent la valeur sélectionnée avant le clic sur le bouton de validation.

    Evidemment les dropdownlist sont toutes générées et traitées de la même façon dans des boucles for (pas de traitement différent pour la première ligne)...

    Quelqu'un a-t-il une idée de pourquoi cette première ligne de dropdownlist est vilaine?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 19
    Par défaut
    Après beaucoup de tests, j'ai eu l'idée de tester sur d'autres navigateur que chrome(6.0.472.62)... le problème est identique sur firefox(3.6.6) mais sur IE8 tout fonctionne correctement...

    je colle quelques extraites de mon code en espérant inspirer quelqu'un

    le page load ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            protected void Page_Load(object sender, EventArgs e)
            {
                    [...]
                    fillInterventionTab();
                    [...]
            }

    La fonction qui remplie le placeholder avec les dropdownlist
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
            private void fillInterventionTab()
            {
                [...]
                try
                {
                    MaterielPlaceHolder.Controls.Clear();
                    int numeroLigne = 0;
     
                    // on ajoute une ligne pour chaque materiel
                    foreach (Materiel materiel in listMateriel)
                    {
                        ++numeroLigne;
     
                        MaterielPlaceHolder.Controls.Add(new LiteralControl("<tr><td>" + materiel.Designation + "</td><td>"));
     
                        // dropdown pose
                        DropDownList dropDownPose = new DropDownList();
                        dropDownPose.ID = "ddPose" + numeroLigne.ToString();
                        fillDropDownWithNumber(dropDownPose, 5, materiel);
                        MaterielPlaceHolder.Controls.Add(dropDownPose);
     
                        MaterielPlaceHolder.Controls.Add(new LiteralControl("</td><td>"));
     
                        // dropdown echange
                        DropDownList dropDownEchange = new DropDownList();
                        dropDownEchange.ID = "ddEchange" + numeroLigne;
                        fillDropDownWithNumber(dropDownEchange, materiel.Quantite, materiel);
                        MaterielPlaceHolder.Controls.Add(dropDownEchange);
     
                        MaterielPlaceHolder.Controls.Add(new LiteralControl("</td><td>"));
     
                        // dropdown retrait
                        DropDownList dropDownRetrait = new DropDownList();
                        dropDownRetrait.ID = "ddRetrait" + numeroLigne;
                        fillDropDownWithNumber(dropDownRetrait, materiel.Quantite, materiel);
                        MaterielPlaceHolder.Controls.Add(dropDownRetrait);
     
                        MaterielPlaceHolder.Controls.Add(new LiteralControl("</td></tr><tr><td colspan='4'>"
                            + "<img src=\"image/element/dots.gif\" alt=\"Separateur de ligne\"/>"
                            + "</td></tr>"));
                    }
                }
                catch(Exception ex)
                {
                    afficherMessage("<br /><br /><p>Exception levée lors de la récupération des matériels: " + ex.Message
                                        + ex.StackTrace + "</p><br /><br />", true);
                }
            }
    La fonction fillDropDownWithNumber ne fait que remplir la dropdownlist passée en paramètre avec des ListItem dont les textes vont de 0 à x et les value sont renseignés en fonction du materiel

    Evènement appelé lors du clic sur le bouton de validation
    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
    28
    29
            protected void ImgBtValider_Click(object sender, ImageClickEventArgs e)
            {
                [...]
                // on vérifie les dropdownlist
                List<Materiel> listMateriel = new List<Materiel>();
                foreach (Control control in MaterielPlaceHolder.Controls)
                {
                    DropDownList ddlist = control as DropDownList;
                    if (ddlist != null)
                    {
                        Materiel materiel = Tools.getMateriel(ddlist.SelectedItem.Value);
                        if (materiel.Quantite > 0)
                        {
                            // on conserve le matériel pour une demande d'intervention
                            listMateriel.Add(materiel);
                        }
                    }
                }
     
                [...]
     
                // on passe l'appel si quelque chose a été demandé
                if (listMateriel.Count > 0)
                {
                    int returnAppel = wsTool.appel(listMateriel, calendarDateInter.SelectedDate, hDebut, hFin, txtReference.Text, txtCommentaire.Text);
                    [...]
                }
                [...]
            }
    Quelqu'un a-t-il une idée s'il vous plait? parce que je comprends vraiment pas là

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 19
    Par défaut
    Bon j'ai fini par trouver ...

    le champs value des listitem est remplie avec du texte provenant d'une base de données. Le texte des dropdownlist de la première ligne contenait un caractère atypique qui j'imagine empêchent les dropdownlist de resélectionner le bon item lors d'un postback...

    Si quelqu'un a une meilleure explication ou peut m'expliquer plus en détails comment le framework (ou le navigateur?) resélectionne le bon ListItem lors d'un postback, ca m’intéresse

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 1
    Par défaut
    J'ai eu un problème similaire.
    Je créais ma dropdownlist dynamiquement (depuis une base access) avec .Add.
    Malheureusement .SelectedValue renvoyait null ou le premier élément.

    Pour résoudre le problème il suffisait de créer la dropdownlist dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void Page_Load(System.object sender, System.EventArgs e)
    {
        if (!Page.IsPostBack) 
        {
           //code pour remplir la dropdownlist
        }
    }
    cf : http://dotnet.developpez.com/faq/asp...lsdropdownlist

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

Discussions similaires

  1. DropDownList, affichage dynamique du menu deroulant
    Par tetedeturcq dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/05/2007, 14h57
  2. Image clickable générées dynamiquement
    Par Azephel dans le forum ASP.NET
    Réponses: 8
    Dernier message: 26/04/2007, 17h13
  3. [AJAX] Code source d'une page générée dynamiquement
    Par Amnesiak dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2007, 18h06
  4. Réponses: 2
    Dernier message: 31/08/2006, 14h11
  5. Fixer une constante dans une fonction générée dynamiquement ?
    Par XecTech dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/08/2006, 20h59

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