如果我在FormView BindItem中传递给它的值不在范围内,如何选择DropDownList的第一项?

时间:2012-12-26 13:14:32

标签: c# asp.net asp.net-4.5

我在Asp.net 4.5中使用FormView来编辑像这样的实体模型:

<asp:FormView runat="server" ....>
   <EditItemTemplate>
     .....
     <asp:DropDownList runat="server" SelectedValue='<%# BindItem.value %>'>
     </asp:DropDownList>
     .....
   </EditItemTemplate>
</asp:FormView>  

如果BindItem.value是DropDownList项中的值之一,则此方法可以正常工作,但如果BindItem.value例如为null或任何超出范围的值,则会引发如下异常:

  

选择超出范围
    参数名称:值

如果BindItem.value错误,有没有办法让DropDownList选择第一项?

1 个答案:

答案 0 :(得分:3)

这绝对是ASP.NET中一直困扰我的事情之一。下拉列表的数据绑定不是很聪明。

我经常用手解决这个问题,而不是使用单/双向数据绑定。在Page_PreRender中,您只需手动检查集合是否包含值。如果没有,请选择索引0.注意,您可能必须先绑定数据。

private void Page_PreRender(object sender, System.EventArgs e)
{
    if (formview1.CurrentMode == FormViewMode.Edit)
    {
        DropDownList ddl = formview1.FindControl("dropdownlist1");
        ddl.ClearSelection();
        var item = ddl.FindByValue("[MYVALUE]");
        if (item == null) ddl.SelectedIndex = 0;
        else item.Selected = true;
    }
}

您也可以尝试这种方法(它可能更干净):

protected void dropdown_DataBound(object sender, EventArgs e)
{
    DropDownList ddl = (DropDownList)sender;
    ddl.ClearSelection();
    var item = ddl.FindByValue("[MYVALUE]");
    if (item == null) ddl.SelectedIndex = 0;
    else item.Selected = true;
}