在ASP.NET 2.0 網站頁面的開發過程中,常常需要把DropDownList等列表類別控制項的SelectedValue值設定為一個從資料庫或其他地方讀取出來的值。
最簡單的辦法就是直接進行指定:
DropDownList1.SelectedValue = "中國";
但有的時候如果DropDownList1中沒有"中國"這一項的話,賦值就會出現異常:
例外詳細資料: System.ArgumentOutOfRangeException: “DropDownList1”有一個無效SelectedValue,因為它不在項目清單中。
想要實現的目標:如果指定的值不在清單項目中,則不設定選取項,且不要拋出異常。
查看MSDN:
SelectedValue 屬性也可以用來選擇清單控制項中的某一項,方法是用該項目的值來設定此屬性。如果清單控制項中的任何項目都不包含指定值,則會引發System.ArgumentOutOfRangeException。
但奇怪的是這樣賦值在大部分情況下都不會出錯,只是偶爾會出錯,透過反射查了一下SelectedValue的實現,找到了原因。
public virtual string SelectedValue
{
get
{
int num1 = this.SelectedIndex;
if (num1 >= 0)
{
return this.Items[num1].Value;
}
return string.Empty;
}
set
{
if (this.Items.Count != 0)
{
if ((value == null) || (base.DesignMode && (value.Length == 0)))
{
this.ClearSelection();
return;
}
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 (item1 != null)
{
this.ClearSelection();
item1.Selected = true;
}
}
this.cachedSelectedValue = value;
}
}
原來只有在頁面是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