février
2008
Derrière un titre aussi confu se cache la suite d’un précédent billet où je parlais d’un problème où une dropdownlist ne lève pas l’événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack= »true », lorsque le viewstate est à false.
Aujourd’hui, nous allons voir comment faire la même chose et lever un événement de changement de selection lorsque nous avons une dropdownlist qui se repète 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 :
<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
{
EnableViewState = false;
List<List<string>> list = new List<List<string>>(new List<string>[] { new List<string>(new string[] { "abc", "def", "ghi" }), new List<string>(new string[] { "123", "456", "789" }) });
MonRepeater.DataSource = list;
MonRepeater.DataBind();
base.OnInit(e);
}
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 :
{
DropDownList list = (DropDownList) e.Item.FindControl("LaList");
list.Items.Add("choisir ...");
foreach (string element in (List<string>)e.Item.DataItem)
{
list.Items.Add(element);
}
}
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 :
{
base.OnLoad(e);
if (IsPostBack)
{
string ctlName = Request.Params.Get("__EVENTTARGET");
if (!string.IsNullOrEmpty(ctlName))
{
// on va chercher la dropdown qui a déclenché le postback dans __EVENTTARGET
foreach (RepeaterItem item in MonRepeater.Items)
{
string clientId = item.ClientID; // utilisé pour avoir la propriété ID, sinon elle vaudra null
DropDownList currentDropDown = (DropDownList)item.FindControl("LaList");
string dropDownName = string.Format("{0}${1}", item.ID, currentDropDown.ID);
if (ctlName.Contains(dropDownName))
ItemChange(currentDropDown, new EventArgs());
}
}
}
}
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’à lever simuler l’événement ItemChange, qui ici, nous affichera le résultat choisi dans le label
{
LeLabel.Text = list.SelectedValue;
}
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.
1 Commentaire + Ajouter un commentaire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
Super !
Ms la méthode ItemChange permet seulement de recuperer l’ancienne valeur..
J’aimerais recuperer la nouvelle valeur choisie par l’utilisateur, comment faire ?