ASP.NET 2.0 Web サイト ページの開発プロセスでは、DropDownList などのリスト コントロールの SelectedValue 値をデータベースまたは他の場所から読み取った値に設定することが必要になることがよくあります。
最も簡単な方法は、直接指定することです。
DropDownList1.SelectedValue = "中国";
ただし、DropDownList1 に「中国」項目がない場合、割り当てで例外が発生することがあります。
例外の詳細: System.ArgumentOutOfRangeException: "DropDownList1" には項目のリストにないため、無効な SelectedValue が含まれています。
実現したいこと: 指定された値がリスト項目にない場合、選択された項目を設定せず、例外をスローしません。
MSDN をチェックしてください:
SelectedValue プロパティを使用して、項目の値をプロパティに設定することで、リスト コントロール内の項目を選択することもできます。リスト コントロール内の項目に指定された値が含まれていない場合は、System.ArgumentOutOfRangeException がスローされます。
しかし、奇妙なことに、このような代入はほとんどの場合は失敗しませんが、リフレクションを通じて SelectedValue の実装を確認したところ、その原因が判明しました。
パブリック仮想文字列 SelectedValue
{
得る
{
int num1 = this.SelectedIndex;
if (num1 >= 0)
{
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 (item1 != 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