mars
2008
Suite à mon précédent billet, cette fois-ci nous allons voir l’utilisation de l’updatePanel dans un repeater.
Soit le repeater suivant, qui contient une dropdown pour chaque item de la collection qui lui est bindée :
<ItemTemplate>
<asp:DropDownList runat="server" ID="LaList" AutoPostBack="true" OnSelectedIndexChanged="IndexChange">
</asp:DropDownList>
</ItemTemplate>
</asp:Repeater>
Le code behind est le suivant :
{
if (!IsPostBack)
LeRepeater.DataBind();
LeLabel.Text = DateTime.Now.ToString();
base.OnLoad(e);
}
protected void IndexChange(object sender, EventArgs e)
{
Result.Text = string.Format("Valeur choisie : {0}", ((DropDownList)sender).SelectedValue);
}
protected void ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DropDownList LaList = (DropDownList)e.Item.FindControl("LaList");
for (int i = (int)e.Item.DataItem; i < (int)e.Item.DataItem + 5; i++)
{
LaList.Items.Add(new ListItem(i.ToString(), i.ToString()));
}
}
}
Ce qui fait qu’on se retrouve avec trois dropDown. La première va de 1 à 5, la seconde de 6 à 10 et la troisième de 11 à 15. Et lorsqu’on sélectionne une valeur, elle s’affiche dans un label.
Si on essaie comme dans le billet précédent d’encadrer par un UpdatePanel :
</asp:ScriptManager>
<asp:Label runat="server" id="LeLabel"/>
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<asp:Repeater ID="LeRepeater" runat="server" DataSource="<%# new int[] {1, 6, 11} %>" OnItemDataBound="ItemDataBound">
<ItemTemplate>
<asp:DropDownList runat="server" ID="LaList" AutoPostBack="true" OnSelectedIndexChanged="IndexChange">
</asp:DropDownList>
</ItemTemplate>
</asp:Repeater>
<asp:Label runat="server" ID="Result" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LaList" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
Au démarrage, on obtient l’erreur suivante :
A control with ID ‘LaList’ could not be found for the trigger in UpdatePanel ‘UpdatePanel1′.
C’est l’utilisation de l’AsyncPostBackTrigger qui pose problème.
Pour corriger ce problème, nous allons le retirer de la page aspx et modifier le code behind pour en ajouter un dynamiquement, à chaque DataBound du repeater.
Ainsi, la méthode devient :
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DropDownList LaList = (DropDownList)e.Item.FindControl("LaList");
for (int i = (int)e.Item.DataItem; i < (int)e.Item.DataItem + 5; i++)
{
LaList.Items.Add(new ListItem(i.ToString(), i.ToString()));
}
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = LaList.UniqueID;
trigger.EventName = "SelectedIndexChanged";
UpdatePanel1.Triggers.Add(trigger);
}
}
Et voilà.
5 Commentaires + 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
Excellent !!! Mille merci, c’est vraiment ce dont j’avais besoin ! Et encore un fois ce post était vraiment utile !
une solution pourrait être :
{ <br />
foreach (Control control in LeRepeater.Controls) <br />
{ <br />
if (control is RepeaterItem) <br />
{ <br />
foreach (Control c in control.Controls) <br />
{ <br />
if (c is DropDownList) <br />
{ <br />
DropDownList cb = (DropDownList)c; <br />
Response.Write(cb.SelectedValue + " "); <br />
} <br />
} <br />
} <br />
} <br />
}
dans la mesure où on connait le contenu du template du repeater
N’ont il pas tous les trois la même ID « LaList » ?
Est ce possible de rajouter un bouton qui affiche la SelectedValue de chacune des trois listes ? Par exemple « Valeurs choisies : 3 – 4 – 11 «
je ne comprends pas la question, toutes les dropdownlists ont des UniqueID différents au final, en effet il n’est pas possible d’avoir 2 controles avec des ID identiques sur une page..
N’hésitez pas à poser votre question dans le forum ASP.NET http://www.developpez.net/forums/forumdisplay.php?f=488
Salut,
Merci pour l’exemple tres instructif!!! Comment ferait ton pour construire les X mêmes DropDownLists mais chacune avec un ID différent.
Mon objectif serait de d’afficher les X SelectedValue des DropDownLists.