FAQ ASP.NET/VB.NET
Sommaire
>
Les webforms >
Formulaires et code-behind >
Dropdownlist
Comment insérer un élément dans une DropDownList à un emplacement donné?
J'ai déclaré l'attribut OnChange sur ma DropDownList mais rien ne se passe lors d'un changement de valeur. Pourquoi?
Parfois ma dropdownlist ne lève pas l'événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack='true', que faire ?
Comment lever l'événement SelectedIndexChanged pour des DropDownList dans un Repeater lorsque le Viewstate est à false ?
Comment faire pour que ma dropdownlist ne cause un postback que sous certaines conditions ?
Comment insérer un élément dans une DropDownList à un emplacement donné?
J'ai déclaré l'attribut OnChange sur ma DropDownList mais rien ne se passe lors d'un changement de valeur. Pourquoi?
Parfois ma dropdownlist ne lève pas l'événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack='true', que faire ?
Comment lever l'événement SelectedIndexChanged pour des DropDownList dans un Repeater lorsque le Viewstate est à false ?
Comment faire pour que ma dropdownlist ne cause un postback que sous certaines conditions ?
| ||
auteur : krest | ||
Pour ajouter un élément à la collection Items d'une DropDownList il existe la fonction Add,
mais celle-ci l'ajoute à la fin. Si on ne veut pas l'ajouter à la fin, il faut utiliser la fonction Insert :
Le code ci-dessus insérera l'élément "2 CV" et sa valeur "Voiture" à la position 0
de collection Items de la DropDownList
| ||
lien : Fonction Insert |
| ||
auteur : Didier Danse | ||
L'erreur la plus fréquente est d'oublier de mettre à true la propriété AutoPostBack.
Ce qui donne:
Si la propriété est à true, lorsque l'on sélectionne une autre valeur, la page est renvoyée
au serveur. Attention de ne pas réinitialiser la valeur sélectionnée dans le Page_Load. | ||
lien : Ma dropdownlist est bien remplie, mais quand je sélectionne un item, c'est toujours la première valeur de la liste qui est retournée |
| ||||
auteur : nico-pyright(c) | ||||
Cela peut arriver si vous avez positionné EnableViewState à false sur votre page. Certaines stratégies d'entreprises prônent de ne pas utiliser le viewstate, pour certaines raisons compréhensibles que je ne détaillerai pas ici, et encouragent à récupérer les valeurs dans tout postback. Mais cela pose un problème lorsqu'on veut utiliser les événements accessibles lorsqu'autopostback vaut true. Imaginons une page toute simple (du code a été omis pour plus de clarté) où EnableViewState vaut false :
et dans le code behind
Si l'on sélectionne les valeurs 2 ou 3, le texte est correctement affiché car on est passé correctement dans l'événement. Par contre, si on rebascule sur la valeur 1, rien n'est affiché, on ne passe pas dans l'événement. En effet, comme le viewstate n'est pas utilisé, asp.net croit que c'est la valeur 1 qui est sélectionnée, et quand on la resélectionne après un premier changement, il en déduit que la valeur n'a pas changée, donc, il ne lève pas l'événement (le brigand). La solution est donc de lever l'événement nous même, en surchargeant le OnLoad.
Et au final, nous n'avons plus besoin de définir OnSelectedIndexChanged="ItemChange" comme attribut de <asp:DropDownList> NB : Si on veut, il est bien sur possible de changer le prototype de la méthode ItemChange, vu qu'elle n'est plus levée par Asp.Net
|
| |||||
auteur : nico-pyright(c) | |||||
Comment faire pour lever un événement de changement lorsqu'une dropdown se repete X fois dans un repeater ? Pour ce faire, nous allons déjà construire notre repeater. Dans la page, on aura par exemple notre repeater, une dropdownlist par item et un label en dehors de ce repeater pour afficher la sélection :
Pour initialiser notre repeater, rien de tel qu'une bonne liste de liste
Pour bien montrer qu'on ne se servira pas du viewstate, on le met explicitement à false dans le OnInit Et dans l'événement du ItemCreated, on construit la dropdown à partir de la liste :
Si on execute la page, on a donc 2 dropdownlist remplies respectivement des valeurs "choisir ...", "abc", "def", "ghi" et "choisir ...", "123", "456", "789". Passons maintenant à la propagation de l'événement, toujours en surchargeant le OnLoad, juste après le base.OnLoad :
Le principe est de parcourir les items du repeater et de concatener l'id de l'item à celle de la dropdownlist en mettant un $ entre les deux ; c'est grace à ces deux valeurs qu'on pourra identifier de manière unique la dropdown qui a déclenché le postback. ctlName vaudra "MonRepeater$ctl00$LaList" et dropDownName vaudra "ctl00$LaList" Une fois la dropdown identifiée, il n'y a plus qu'à simuler l'événement ItemChange, qui ici, nous affichera le résultat choisi dans le label
Voilà pour la dropdownlist dans un repeater NB : ici, j'ai utilisé une astuce pour récupérer l'id de l'item du repeater. En effet, dans le OnLoad il vaut null, je force la génération du ClientId pour pouvoir récupérer l'ID. |
| ||
auteur : sam_XIII (Samuel Beauvois) | ||
On met la propriété AutoPostBack à true. Le principe est d'empecher la publication du postback en modifiant le javascript de l'attribut onchange pour qu'il renvoit false lorsque les conditions ne sont pas respectées.
le code est completé lors de la génération de la page. Dans le code html généré, __doPostBack(...) sera automatiquement rajouté après le else (parce qu'on à mis le AutoPostBack = true). Dans cet exemple, on envoit le formulaire uniquement lorsque c'est le dernier élément qui est sélectionné. |