Au cours du processus de développement des pages du site Web ASP.NET 2.0, il est souvent nécessaire de définir la valeur SelectedValue des contrôles de liste tels que DropDownList sur une valeur lue dans la base de données ou à d'autres endroits.
Le plus simple est de le préciser directement :
DropDownList1.SelectedValue = "Chine" ;
Mais parfois, s'il n'y a pas d'élément « Chine » dans DropDownList1, une exception se produira dans l'affectation :
Détails de l'exception : System.ArgumentOutOfRangeException : "DropDownList1" a une SelectedValue non valide car elle ne figure pas dans la liste des éléments.
Ce que vous souhaitez obtenir : si la valeur spécifiée ne figure pas dans l'élément de liste, ne définissez pas l'élément sélectionné et ne lancez pas d'exception.
Découvrez MSDN :
La propriété SelectedValue peut également être utilisée pour sélectionner un élément dans un contrôle de liste en définissant la propriété avec la valeur de l'élément. Si un élément du contrôle de liste ne contient pas la valeur spécifiée, System.ArgumentOutOfRangeException est levée.
Mais ce qui est étrange, c'est qu'une telle affectation ne se passera pas mal dans la plupart des cas, mais elle se passera parfois mal. J'ai vérifié l'implémentation de SelectedValue par réflexion et j'en ai trouvé la raison.
chaîne virtuelle publique SelectedValue
{
obtenir
{
int num1 = this.SelectedIndex;
si (num1 >= 0)
{
renvoie this.Items[num1].Value ;
}
return string.Empty;
}
ensemble
{
si (this.Items.Count != 0)
{
if ((value == null) || (base.DesignMode && (value.Length == 0)))
{
this.ClearSelection();
retour;
}
ListItem item1 = this.Items.FindByValue(value);
if ((((this.Page != null) && this.Page.IsPostBack) && this._stateLoaded) && (item1 == null))
{
throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" }));
}
si (élément1 != nul)
{
this.ClearSelection();
item1.Selected = vrai ;
}
}
this.cachedSelectedValue = valeur ;
}
}
Il s'avère que les erreurs d'affectation ne se produisent que lorsque la page est IsPostBack.
De plus, une exception se produira si vous écrivez comme ceci :
DropDownList1.Items.FindByValue("Chine").Selected = true;
J'ai finalement trouvé un moyen de répondre aux exigences ci-dessus :
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("Chine"));
Autrement dit, si l'élément spécifié n'est pas trouvé via FindByValue, il sera nul et Items.IndexOf(null) renverra -1
http://www.cnblogs.com/weizhuangzhi/archive/2006/12/13/591251.html