使用dropdownlist控件时,如果给SelectedValue赋了一个不存在的值,则会抛出一个异常,提示该控件“有一个无效 SelectedValue,因为它不在项目列表中”。
为了解决这个问题,可以先检查一下dropdownlist的选项,不过那样太麻烦,也不具备通用性,笔者选择了重写该控件,以下是相关的代码:
public class MyDropDownList :DropDownList
{
public string ExceptionItemText
{
get
{
if (ViewState["ExceptionItemText"] == null)
return "-----";
return ViewState["ExceptionItemText"].ToString();
}
set
{
ViewState["ExceptionItemText"] = value;
}
}
public string ExceptionItemValue
{
get
{
if (ViewState["ExceptionItemValue"] == null)
return "0";
return ViewState["ExceptionItemValue"].ToString();
}
set
{
ViewState["ExceptionItemValue"] = value;
}
}
public override string SelectedValue
{
get
{
return base.SelectedValue;
}
set
{
try
{
base.SelectedValue = value;
}
catch (ArgumentOutOfRangeException)
{
ListItem itm = new ListItem(ExceptionItemText, ExceptionItemValue);
Items.Insert(0, itm);
SelectedIndex = 0;
}
}
}
protected override void OnDataBinding(EventArgs e)
{
try
{
base.OnDataBinding(e);
}
catch (ArgumentOutOfRangeException)
{
ListItem itm = new ListItem(ExceptionItemText, ExceptionItemValue);
Items.Insert(0, itm);
SelectedIndex = 0;
}
}
}
此处重载了SelectValue属性和OnDataBinding方法,目的是为了兼容两种情况:
一种情况是直接给控件赋值,比如ddl.SelectedValue="0"。
另一种情况是在绑定的时候赋值,比如<asp:DropDownList SelectedValue='<%#Bind("value")%>' > 。
当然你也可以根据自己的需要编写特定的业务逻辑,这里就不再详述。