В процессе разработки страниц веб-сайта ASP.NET 2.0 часто необходимо установить для значения SelectedValue элементов управления списка, таких как DropDownList, значение, считанное из базы данных или других мест.
Самый простой способ — указать его напрямую:
DropDownList1.SelectedValue = "Китай";
Но иногда, если в DropDownList1 нет пункта «Китай», в присваивании возникает исключение:
Сведения об исключении: System.ArgumentOutOfRangeException: «DropDownList1» имеет недопустимое значение SelectedValue, поскольку его нет в списке элементов.
Чего вы хотите добиться: если указанного значения нет в элементе списка, не устанавливайте выбранный элемент и не вызывайте исключение.
Проверьте MSDN:
Свойство SelectedValue также можно использовать для выбора элемента в элементе управления «Список», задав для свойства значение элемента. Если какой-либо элемент в элементе управления «Список» не содержит указанного значения, генерируется исключение System.ArgumentOutOfRangeException.
Но странно то, что такое присвоение в большинстве случаев не происходит неправильно, но иногда оно происходит неправильно. Я проверил реализацию SelectedValue через рефлексию и нашел причину.
общедоступная виртуальная строка SelectedValue
{
получать
{
int num1 = this.SelectedIndex;
если (число1 >= 0)
{
верните это.Items[num1].Value;
}
вернуть строку.Пусто;
}
набор
{
если (this.Items.Count != 0)
{
if ((value == null) || (base.DesignMode && (value.Length == 0)))
{
this.ClearSelection();
возвращаться;
}
ListItem item1 = this.Items.FindByValue(значение);
if ((((this.Page != null) && this.Page.IsPostBack) && this._stateLoaded) && (item1 == null))
{
throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", новый объект[] { this.ID, "SelectedValue" }));
}
если (пункт1 != ноль)
{
this.ClearSelection();
элемент1.Выбранный = правда;
}
}
this.cachedSelectedValue = значение;
}
}
Оказывается, ошибки присваивания возникают только тогда, когда страница является IsPostBack.
Кроме того, возникнет исключение, если написать так:
DropDownList1.Items.FindByValue("Китай").Selected = true;
Наконец нашел способ достичь вышеуказанных требований:
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("Китай"));
То есть, если указанный элемент не найден с помощью FindByValue, он будет иметь значение null, а Items.IndexOf(null) вернет -1.
http://www.cnblogs.com/weizhuangzhi/archive/2006/12/13/591251.html