Durante o processo de desenvolvimento de páginas de site ASP.NET 2.0, muitas vezes é necessário definir o valor SelectedValue de controles de lista, como DropDownList, para um valor lido do banco de dados ou de outros locais.
A maneira mais fácil é especificá-lo diretamente:
DropDownList1.SelectedValue = "China";
Mas às vezes, se não houver nenhum item "China" em DropDownList1, ocorrerá uma exceção na atribuição:
Detalhes da exceção: System.ArgumentOutOfRangeException: "DropDownList1" possui um SelectedValue inválido porque não está na lista de itens.
O que você deseja alcançar: Se o valor especificado não estiver no item da lista, não defina o item selecionado e não lance uma exceção.
Confira o MSDN:
A propriedade SelectedValue também pode ser usada para selecionar um item em um controle de lista definindo a propriedade com o valor do item. Se algum item no controle de lista não contiver o valor especificado, System.ArgumentOutOfRangeException será lançado.
Mas o estranho é que tal atribuição não dará errado na maioria dos casos, mas ocasionalmente dará errado. Verifiquei a implementação de SelectedValue por meio de reflexão e descobri o motivo.
string virtual pública SelectedValue
{
pegar
{
int num1 = this.SelectedIndex;
se (num1 >= 0)
{
retorne isto.Items[num1].Valor;
}
retornar string.Empty;
}
definir
{
se (this.Items.Count! = 0)
{
if ((valor == nulo) || (base.DesignMode && (valor.Comprimento == 0)))
{
this.ClearSelection();
retornar;
}
ListItem item1 = this.Items.FindByValue(valor);
if ((((this.Page != null) && this.Page.IsPostBack) && this._stateLoaded) && (item1 == null))
{
lançar new ArgumentOutOfRangeException("valor", SR.GetString("ListControl_SelectionOutOfRange", novo objeto[] { this.ID, "SelectedValue" }));
}
if (item1! = nulo)
{
this.ClearSelection();
item1.Selecionado = verdadeiro;
}
}
this.cachedSelectedValue = valor;
}
}
Acontece que erros de atribuição ocorrem apenas quando a página é IsPostBack.
Além disso, ocorrerá uma exceção se você escrever assim:
DropDownList1.Items.FindByValue("China").Selected = true;
Finalmente encontrei uma maneira de atingir os requisitos acima:
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("China"));
Ou seja, se o item especificado não for encontrado através de FindByValue, ele será nulo e Items.IndexOf(null) retornará -1
http://www.cnblogs.com/weizhuangzhi/archive/2006/12/13/591251.html