Durante el proceso de desarrollo de las páginas del sitio web ASP.NET 2.0, a menudo es necesario establecer el valor SelectedValue de los controles de lista como DropDownList en un valor leído de la base de datos u otros lugares.
La forma más sencilla es especificarlo directamente:
DropDownList1.SelectedValue = "China";
Pero a veces, si no hay ningún elemento "China" en DropDownList1, se producirá una excepción en la asignación:
Detalles de la excepción: System.ArgumentOutOfRangeException: "DropDownList1" tiene un SelectedValue no válido porque no está en la lista de elementos.
Lo que desea lograr: si el valor especificado no está en el elemento de la lista, no configure el elemento seleccionado y no genere una excepción.
Consulte MSDN:
La propiedad SelectedValue también se puede utilizar para seleccionar un elemento en un control de lista estableciendo la propiedad con el valor del elemento. Si algún elemento del control de lista no contiene el valor especificado, se lanza System.ArgumentOutOfRangeException.
Pero lo extraño es que dicha asignación no saldrá mal en la mayoría de los casos, pero ocasionalmente saldrá mal. Verifiqué la implementación de SelectedValue a través de la reflexión y encontré el motivo.
cadena virtual pública SelectedValue
{
conseguir
{
int num1 = this.SelectedIndex;
si (núm1 >= 0)
{
devuelve this.Items[num1].Value;
}
cadena de retorno. Vacío;
}
colocar
{
si (este.Items.Count! = 0)
{
if ((valor == nulo) || (base.DesignMode && (valor.Longitud == 0)))
{
this.ClearSelection();
devolver;
}
ListItem elemento1 = this.Items.FindByValue(valor);
if ((((esta.Página! = nulo) && esta.Página.IsPostBack) && this._stateLoaded) && (item1 == nulo))
{
lanzar nueva ArgumentOutOfRangeException("valor", SR.GetString("ListControl_SelectionOutOfRange", nuevo objeto[] { this.ID, "SelectedValue" }));
}
si (elemento1! = nulo)
{
this.ClearSelection();
item1.Selected = verdadero;
}
}
this.cachedSelectedValue = valor;
}
}
Resulta que los errores de asignación solo ocurren cuando la página es IsPostBack.
Además, se producirá una excepción si escribe así:
DropDownList1.Items.FindByValue("China").Selected = verdadero;
Finalmente encontré una manera de lograr los requisitos anteriores:
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("China"));
Es decir, si el elemento especificado no se encuentra a través de FindByValue, será nulo y Items.IndexOf(null) devolverá -1
http://www.cnblogs.com/weizhuangzhi/archive/2006/12/13/591251.html