我正在尝试使用System.Web.UI.WebControls.ListItems的Collections.Generic.List来DataBind一个asp:DropDownList。 DataBind()抛出了这个错误。
System.ArgumentOutOfRangeException:'ddlPlatinumOptions'有一个SelectedValue无效,因为它在项目列表中不存在。
的.ascx
<asp:DropDownList ID="ddlPlatinumOptions" runat="server" AutoPostBack="true" width="100%"></asp:DropDownList>
.ascx.cs
public void BindPlatinumOptions()
{
ddlPlatinumOptions.DataTextField = "Text";
ddlPlatinumOptions.DataValueField = "Value";
ddlPlatinumOptions.DataSource = _platinumOptions;
ddlPlatinumOptions.DataBind(); // Throwing Error
}
呈现
MattressProtectionInfo standard = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, false);
MattressProtectionInfo premium = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, true);
List<ListItem> plans = new List<ListItem>();
if (standard != null)
{
plans.Add(new ListItem(standard.Price.ToString("C") + " - Standard 5-Year Platinum Protection", standard.ProductID.ToString()));
}
if (premium != null)
{
plans.Add(new ListItem(premium.Price.ToString("C") + " - Premium 5-Year Platinum Protection", premium.ProductID.ToString()));
}
_view.PlatinumOptions = plans;
_view.BindPlatinumOptions();
数据示例
我试过了
我抓住吸管。似乎数据绑定器试图在下拉列表中选择不存在的内容。
我的代码中是否有错误,我没有看到?任何想法?
答案 0 :(得分:2)
嗯,它超出范围异常。在绑定到DropDownList之前,您是否在任何时候将SelectedIndex设置为默认值?
答案 1 :(得分:2)
在遇到这个问题之后,我调试了ASP.NET源代码并在ASP.NET源代码中找到了一个缺陷(?)(因此,我们的问题的解决方案):
在内部,System.Web.UI.WebControls.Listcontrol
缓存最近使用的SelectedValue
。因此,在SelectedValue
已经设置SelectedValue
之后发生数据绑定(本机清除Request.Form[]
属性)时,数据绑定操作会尝试查找并预先选择以前缓存的数据项目。不幸的是,如果在新的DataSource
列表中找不到缓存的值而不是静默地保留当前的SelectedValue
null
值,则会引发异常。
我猜他们这样做是因为当使用ViewState
和数据源对象进行数据绑定时,后来的数据绑定操作会删除SelectedValue
获取的Request.Form[]
}。
因此,每当您在页面生命周期内对ListControl
执行多个数据绑定操作以及数据源不同时,就会发生此异常。
public virtual string SelectedValue
{
set
{
if (Items.Count != 0)
{
// at design time, a binding on SelectedValue will be reset to the default value on OnComponentChanged
if (value == null || (DesignMode && value.Length == 0))
{
ClearSelection();
return;
// !!! cachedSelectedValue is not getting reset here !!!
}
...
// always save the selectedvalue
// for later databinding in case we have viewstate items or static items
cachedSelectedValue = value;
}
}
而不是:
dropDownBox.DataSource = ...;
dropDownBox.DataBind();
写下这个:
dropDownBox.Items.Clear();
dropDownBox.SelectedValue = null;
dropDownBox.DataSource = ...;
dropDownBox.DataBind();
(仅当dropDownBox.Items.Clear();
已经为空时,才需要dropDownBox.Items
操作。)