ASP.NET 2.0 웹 사이트 페이지 개발 과정에서 DropDownList와 같은 목록 컨트롤의 SelectedValue 값을 데이터베이스나 다른 위치에서 읽은 값으로 설정해야 하는 경우가 많습니다.
가장 쉬운 방법은 직접 지정하는 것입니다.
DropDownList1.SelectedValue = "중국";
그러나 때때로 DropDownList1에 "China" 항목이 없으면 할당에서 예외가 발생합니다.
예외 정보: System.ArgumentOutOfRangeException: "DropDownList1"에는 항목 목록에 없기 때문에 잘못된 SelectedValue가 있습니다.
달성하고자 하는 것: 지정된 값이 목록 항목에 없으면 선택한 항목을 설정하지 말고 예외를 발생시키지 마십시오.
MSDN을 확인하세요:
SelectedValue 속성은 항목 값으로 속성을 설정하여 목록 컨트롤에서 항목을 선택하는 데에도 사용할 수 있습니다. 목록 컨트롤의 항목에 지정된 값이 포함되어 있지 않으면 System.ArgumentOutOfRangeException이 발생합니다.
그런데 이상한 점은 이러한 할당이 대부분의 경우 잘못되지 않지만 가끔 잘못되는 경우가 있다는 점입니다. Reflection을 통해 SelectedValue의 구현을 확인하고 그 이유를 찾았습니다.
공개 가상 문자열 SelectedValue
{
얻다
{
int num1 = this.SelectedIndex;
if (숫자1 >= 0)
{
return this.Items[num1].Value;
}
문자열을 반환합니다.빈;
}
세트
{
if (this.Items.Count != 0)
{
if ((value == null) || (base.DesignMode && (value.Length == 0)))
{
this.ClearSelection();
반품;
}
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" }));
}
if (항목1 != null)
{
this.ClearSelection();
item1.Selected = true;
}
}
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