Accéder au contenu principal

ASP.NET : Mon DropDownList ne change pas de valeur après un allez-retour au serveur.

Comme ceci peut être bête, une surprise désagréable capable de te saisir sur un projet pendant près de 8 heures. Je suis victime de cela, je sais de quoi je parle. J'explique :

1. Problème
Sur ma page aspx j'ai un "DropDownList" (ddl) que je rempli dynamiquement des données venant d'une BD ou un fichier xml, ou je ne sais où, ce n'est pas notre souci. L'habitude nous pousse à le mettre à l'événement "OnLoad" (càd chargement) de la page et je veux maintenant qu'en sélectionnant un item, qu'il s'affiche à l'écran, dans mon ddl.

<asp:DropDownList ID="ddlExemple" runat="server"></asp:DropDownList>


protected void Page_Load(objet sender, EventArgs e)
{
         //code chargeant les données dans notre ddl
}

Facile ? Oui, jusque là. Quand nous sélectionnons tous se passe bien. Normal !
Une telle situation n'a vraiment pas d'intérêt. Dans les cas réels, l'événement "SelectedItemChange" déclenché par le ddl sert à construire un autre contrôle ou de façon générique à exécuté du code.

Cependant, sur notre page ajoutons un "TextBox" (txt), l'idée est d'afficher l'élément sélectionner sur le ddl dans le txt. Pour le faire, ajoutons une propriété AutoPostBack="true" à notre ddl. Le code devient alors :

<asp:DropDownList ID="ddlExemple" runat="server" AutoPostBack="true" OnSelectedChange="ddlExemple></asp:DropDownList>
<asp:TextBox ID="txtExemple" runat="server" Text=""><asp:TextBox>


protected void ddlExemple_SelectedItemChange(objetc sender, EventArgs e)
{
         txtExemple.Text = ((DropDownList)sender).SelectedValue;
}

Surprise ! la valeur initiale est toujours maintenue.
Je m'en vais vous expliquer le pourquoi.

2. Solution :
La propriété AutoPostBack est à l'origine de cela. En réalité le ddl et txt sont des controles serveur (stéréotype : runat="server"). Ils peuvent se mettre à jour que côté serveur alors la propriété AutoPostBack="true" force la page à faire un allez-retour vers le serveur pour aller exécuter le code de txtExemple.Text = ...
Ainsi à son retour puisque la page doit se rafraichir, l'événement OnLoad de la page s'exécute et réinitialise la page en remettant l'item initiale à "selected".

Pour le contourner plusieurs mécanismes sont possible mais allons traiter le plus simple; c'est de tester si la page fait un rafraichissement ou c'est le premier load. Notre code devient :

protected void Page_Load(objet sender, EventArgs e)
{
        if(!IsPostBack)
        {
                //code chargeant les données dans notre ddl
         }
}


Voila tous.
Je crois ce blog vous a servit. Vos critiques nous aide à améliorer nos postes, n'oublier pas d'en laisser.

Commentaires

  1. Pour completer cette idée géniale avec un exemple concret , voici ce que j'avais pu faire

    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    Charger_Contact();

    }

    }



    void Charger_Contact()
    {
    SqlConnection ConnexionDb = (SqlConnection)Session["Connecting"];
    string RqtSelect = "SELECT * FROM CONTACTS order by nom_contact asc";
    SqlCommand Sqlcmd = new SqlCommand(RqtSelect, ConnexionDb);
    SqlDataReader SqlRead = Sqlcmd.ExecuteReader();
    Liste_Contact.DataSource = SqlRead;
    Liste_Contact.DataValueField = "ID_CONTACT";
    Liste_Contact.DataTextField = "NOM_CONTACT";
    Liste_Contact.DataBind();
    SqlRead.Close();
    }

    RépondreSupprimer

Enregistrer un commentaire

Posts les plus consultés de ce blog

Microsoft pense que Silverlight complètera le HTML 5, Vraiment...

Microsoft, en plus de son soutien aux standards web, continue de promouvoir Silverlight. Il affirme même aujourd'hui que sa technologie web va au-delà de ce que peut faire l'HTML 5. Cet avis ne remet pas en cause l'implication de Microsoft dans la futur version du HTML. La firme de Redmond participe toujours activement aux groupe de travail sur le sujet et la prochaine version de son Internet Explorer promet de faire figure de bon élève en matière de respects des standards. Pour autant, Microsoft continue de sortir des versions majeures de Silverlight (4 en tout). Microsoft ne veut donc pas choisir entre des technologies pourtant assez opposées, voire antinomiques puisque le HTML 5 vise l'abandon des plug-ins. Selon l'entreprise, le but derrière Silverlight n'est pas de remplacer l'HTML mais de répondre à des besoins auxquels ce dernier ne peut répondre. Comme par exemple, la vidéo 3D haute définition, la protection du contenu, les streaming fluides

Imagine cup 2012, Les congolais seront à Sydney en Australie.

Depuis Juillet 2011, Microsoft a donné le coup d’envoi de la 10 e édition de la compétition « Imagine Cup 2012 » dont la finale mondiale est prévue en juillet à Sydney, en Australie. Développeurs congolais, à vos talents ! Les étudiants et porteurs de brillantes idées dans le domaine des nouvelles technologies peuvent proposer à ce concours international un projet de création logicielle ou de solution technologique innovante. Le sujet est le même depuis trois ans : «Imaginez un monde où la technologie aide à résoudre les problèmes les plus difficiles auxquels nous sommes confrontés aujourd’hui». Les lauréats de la finale de la sous-région Afrique Centre/Ouest, qui seront soumis à plusieurs mois de compétition intense, seront invités pour la finale mondiale, en Australie en juillet 2012. Le concours est ouvert aux projets entrant dans les 6 catégories suivantes : Software Design, Game Design, IT Challenge, Windows Azure, Windows 8 et Windows Phone 7. La compétition dans la