▲在ASP.NET2.0网站页面的开发过程...... 在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 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-10-1 01:19 , Processed in 0.242690 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.