查看文章
 
有一个无效 SelectedValue,因为它不在项目列表中
2008-12-31 22:26

最近在做用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的实现,找到了解法。原来只有在this.Page.IsPostBack的情况下,赋值才会出错。只需这样赋值:

DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("qqcrazyer"));

就是如果通过FindByValue没有找到指定项则为null,而Items.IndexOf(null)会返回-1.

还有一种方法就是改一下你的代码,改成
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2"
DataTextField="a_code" DataValueField="a_code" SelectedValue='<%# Bind("a_code") %>' AppendDataBoundItems="True">
<asp:ListItem Value='' >(无)</asp:ListItem>
</asp:DropDownList>
在绑定的数据前加上一项(无),它对应null值。这样就不会出错了。

不过上述办法只是让它不出错而已,如果是因为页面加载时数据未绑定而导致上述错误,则最好是在页面加载时用一静态变量保存将要赋予下拉列表的值,等数据加载完毕,在下拉列表的DataBound(object sender, EventArgs e)事件中使用DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("qqcrazyer"));则能给综赋予想要给的值,前提是这个值本是它item值中之一,只是因为数据未绑定才导致上述错误的.


类别:c# .net||添加到搜藏 |分享到i贴吧|浏览(2056)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu