安全的设置DropDownList等列表类控件的SelectedValue值

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航