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...

Convertir une Image en tableau des bits... Image -> byte[]

Après très long congé, je suis de retour pour vous ... N'oubliez pas que chez nous ce sont les débutants les plus forts. J'ai pensé à vous, la conversion d'une image en un tableau des bits peut être aussi important que ça peut paraitre bête. Surtout quand on veut insérer une image dans une base des données, peu des SGBD supporte le format "image" pour éviter des surprises (raison d’interopérabilité) une conversion s’avère importante. Faut dire aussi que ça reste le seul moyen d'enregistrer une image dans un fichier; Voici le code en C# : //1. Je commence par créer un objet bitmap //Son constructeur prend en paramètre une chaine 'filename' qui représente le chemin physique de l'image. Bitmap image = new Bitmap(filename); //2. Je crée un objet Stream qui va embarquer notre flux image MemoryStream memory = new MemoryStream(); //3. On écris l'image dans le flux 'memory' en précisant son format image.Save(memory, ImageFormat.Jpeg); //...