巧解 有一个无效 SelectedValue,因为它不在项目列表中。异常

最近在做用asp.net 2.0 开发,在将绑定数据到DropDownList。时抛出了一个很奇怪的异常。
异常详细信息: System.ArgumentOutOfRangeException: “DropDownList1”有一个无效 SelectedValue,因为它不在项目列表中。

于是查了一下MSDN:DropDownList.SelectedValue 属性:
此属性返回选定的 ListItem 的 Value 属性。通常使用 SelectedValue 属性确定列表控件中选定项的值。如果选定了多个项,则返回索引最小的选定项的值。如果未选定任何项,则返回一个空字符串 ("")。
SelectedValue 属性还可以用于选择列表控件中的某一项,方法是用该项的值设置此属性。如果列表控件中的任何项都不包含指定值,则会引发 System.ArgumentOutOfRangeException。

检查了一下代码。发现自己在没有绑DropDownList1之前就给DropDownList1.SelectedValue ="qqcrazyer";
怪不得出现异常;这里的DropDownList1没有qqcrazyer这一项。
但是这样赋值在做如市、县连动的值改时候很难避免不碰到赋一个列表没有的值,
怎么办呢?

于是又去反射查了一下SelectedValue的实现,找到了解法。

ContractedBlock.gif ExpandedBlockStart.gif 反射代码
 1None.gif[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Themeable(false), WebSysDescription("ListControl_SelectedValue"), WebCategory("Behavior"), DefaultValue(""), Bindable(true, BindingDirection.TwoWay)]
 2None.gifpublic virtual string SelectedValue
 3ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 4InBlock.gif      get
 5ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 6InBlock.gif            int num1 = this.SelectedIndex;
 7InBlock.gif            if (num1 >= 0)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 9InBlock.gif                  return this.Items[num1].Value;
10ExpandedSubBlockEnd.gif            }

11InBlock.gif            return string.Empty;
12ExpandedSubBlockEnd.gif      }

13InBlock.gif      set
14ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
15InBlock.gif            if (this.Items.Count != 0)
16ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
17InBlock.gif                  if ((value == null|| (base.DesignMode && (value.Length == 0)))
18ExpandedSubBlockStart.gifContractedSubBlock.gif                  dot.gif{
19InBlock.gif                        this.ClearSelection();
20InBlock.gif                        return;
21ExpandedSubBlockEnd.gif                  }

22InBlock.gif                  ListItem item1 = this.Items.FindByValue(value);
23InBlock.gif                  if ((((this.Page != null&& this.Page.IsPostBack) && this._stateLoaded) && (item1 == null))
24ExpandedSubBlockStart.gifContractedSubBlock.gif                  dot.gif{
25ExpandedSubBlockStart.gifContractedSubBlock.gif                        throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange"new object[] dot.gifthis.ID, "SelectedValue" }));
26ExpandedSubBlockEnd.gif                  }

27InBlock.gif                  if (item1 != null)
28ExpandedSubBlockStart.gifContractedSubBlock.gif                  dot.gif{
29InBlock.gif                        this.ClearSelection();
30InBlock.gif                        item1.Selected = true;
31ExpandedSubBlockEnd.gif                  }

32ExpandedSubBlockEnd.gif            }

33InBlock.gif            this.cachedSelectedValue = value;
34ExpandedSubBlockEnd.gif      }

35ExpandedBlockEnd.gif}

36None.gif 
37None.gif


哈哈 原来只有在this.Page.IsPostBack的情况下,赋值才会出错。
只需这样赋值:
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("qqcrazyer"));
就是如果通过FindByValue没有找到指定项则为null,而Items.IndexOf(null)会返回-1.

转载于:https://www.cnblogs.com/qqcrazyer/archive/2007/01/26/631455.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值