| 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 :
MyDropDownList. Items . Insert (0, new ListItem (" 2 CV " , " Voiture " ))
|
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 : 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 :
< %@ Page Language= " C# " EnableViewState= " false " AutoEventWireup= " false " CodeBehind= " Default.aspx.cs " Inherits= " testDropdown.Default " %>
< asp:DropDownList ID= " myDropDown " runat= " server " AutoPostBack= " true " OnSelectedIndexChanged= " ItemChange " >
< asp:ListItem Value= " valeur1 " Text= " valeur1 " / >
< asp:ListItem Value= " valeur2 " Text= " valeur2 " / >
< asp:ListItem Value= " valeur3 " Text= " valeur3 " / >
< / asp:DropDownList>
< asp:Label ID= " myLabel " runat= " server " / >
|
et dans le code behind
Protected Sub ItemChange (ByVal sender As Object, ByVal e As EventArgs)
myLabel. Text = String . Format (" Valeur selectionnée : {0} " , sender. SelectedValue )
End Sub
|
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.
Protected Overrides Sub OnLoad (ByVal e As System. EventArgs )
If IsPostBack Then
Dim ctlName As String = Request . Params . Get (" __EVENTTARGET " )
If Not String . IsNullOrEmpty (ctlName) Then
If ctlName. Contains (myDropDown. ID ) Then
ItemChange (myDropDown, New EventArgs ())
End If
End If
End If
MyBase. OnLoad (e)
End Sub
Protected Sub ItemChange (ByVal sender As Object, ByVal e As EventArgs)
myLabel. Text = String . Format (" Valeur selectionnée : {0} " , sender. SelectedValue )
End Sub
|
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
Private Sub ItemChange (ByVal list As DropDownList, ByVal e As EventArgs)
End Sub
|
|
| 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 : < asp:Repeater runat= " server " OnItemCreated= " ItemCreated " ID= " MonRepeater " >
< ItemTemplate>
< asp:DropDownList runat= " server " ID= " LaList " AutoPostBack= " true " / >
< / ItemTemplate>
< / asp:Repeater>
< asp:Label runat= " server " ID= " LeLabel " / >
|
Pour initialiser notre repeater, rien de tel qu'une bonne liste de liste
Protected Overrides Sub OnInit (ByVal e As System. EventArgs )
EnableViewState = False
Dim list As New List (Of List (Of String ))
Dim list1 As New List (Of String )
list1. Add (" abc " )
list1. Add (" def " )
list1. Add (" ghi " )
Dim list2 As New List (Of String )
list2. Add (" 123 " )
list2. Add (" 456 " )
list2. Add (" 789 " )
list. Add (list1)
list. Add (list2)
MonRepeater. DataSource = list
MonRepeater. DataBind ()
MyBase. OnInit (e)
End Sub
|
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 :
Protected Sub ItemCreated (ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
Dim list As DropDownList = e. Item . FindControl (" LaList " )
list. Items . Add (" choisir ... " )
For Each element As String In e. Item . DataItem
list. Items . Add (element)
Next
End Sub
|
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 :
Protected Overrides Sub OnLoad (ByVal e As System. EventArgs )
MyBase. OnLoad (e)
If IsPostBack Then
Dim ctlName As String = Request . Params . Get (" __EVENTTARGET " )
If Not String . IsNullOrEmpty (ctlName) Then
For Each item As RepeaterItem In MonRepeater. Items
Dim clientId As String = item. ClientID
Dim currentDropDown As DropDownList = item. FindControl (" LaList " )
Dim dropDownName As String = String . Format (" {0}${1} " , item. ID , currentDropDown. ID )
If ctlName. Contains (dropDownName) Then
ItemChange (currentDropDown, New EventArgs ())
End If
Next
End If
End If
End Sub
|
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
Sub ItemChange (ByVal list As DropDownList, ByVal args As EventArgs)
LeLabel. Text = list. SelectedValue
End Sub
|
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.
|
Consultez les autres F.A.Q's
Les sources présentés sur cette pages sont libre de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©2007
Developpez LLC. Tout droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de
l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérets.
Cette page est déposée à la SACD.
|