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.
J'aime bien.
RépondreSupprimerPour completer cette idée géniale avec un exemple concret , voici ce que j'avais pu faire
RépondreSupprimerprotected 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();
}