janvier
2008
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 :
<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
{
myLabel.Text = string.Format("Valeur selectionnée : {0}", ((DropDownList) sender).SelectedValue);
}
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.
{
if (IsPostBack)
{
// on lève l'évenement si le postback a été déclenché par notre dropdown
string ctlName = Request.Params.Get("__EVENTTARGET");
if (!string.IsNullOrEmpty(ctlName))
if (ctlName.Contains(myDropDown.ID))
ItemChange(myDropDown, new EventArgs());
}
base.OnLoad(e);
}
protected void ItemChange(object sender, EventArgs e)
{
myLabel.Text = string.Format("Valeur selectionnée : {0}", ((DropDownList) sender).SelectedValue);
}
Et au final, nous n’avons plus besoin de définir OnSelectedIndexChanged= »ItemChange » comme attribut de <asp:DropDownList>
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
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 void ItemChange(DropDownList list, EventArgs e)
{
}
par exemple