【问题标题】:DataBinding asp.net DropDownList from a List of ListItems causing System.ArgumentOutOfRangeException Error从导致 System.ArgumentOutOfRangeException 错误的 ListItems 列表中的 DataBinding asp.net DropDownList
【发布时间】:2015-02-02 13:50:29
【问题描述】:

我正在尝试使用 System.Web.UI.WebControls.ListItems 的 Collections.Generic.List 对 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();

数据示例

  • 价值 =“21696”文本 =“99.95 美元 - 标准 5 年白金保护”
  • 价值 =“21702”文本 =“119.95 美元 - 高级 5 年白金保护”

我尝试过的事情

  • 在我的数据之前清空数据源和数据绑定以清除任何内容(也破坏了 dataBind)
  • 重新定位 DataTextField 和 DataValueField 的位置(浪费时间 - 没有变化)
  • 在数据绑定之前声明选定的索引为 0
  • ddlPlatinumOptions.Items.Clear();
  • ddlPlatinumOptions.ClearSelection();

我在抓稻草。似乎数据绑定正在尝试选择下拉列表中不存在的内容。

我没有看到我的代码中是否有错误?有什么想法吗?

【问题讨论】:

  • 而不是 Binding ..为什么不直接将项目添加到 DropDownList .. 如果这不是一个选项,那么看看这里这应该有助于解决您的问题 Ryan O'Hara @987654321 @
  • 我已经在构建我的 ListItem ,就像那个答案中一样。问题似乎在 asp.net DropDownList.DataBind() 中。它似乎试图选择一个尚未绑定的值?如果我将 BindPlatinumOptions() 包装在 try catch 中并吞下错误,ListItem 仍会呈现到页面并正常工作。我想知道它为什么会抛出这个错误,但我无法找到 asp 3.5 的 asp.net Databind 方法的源代码
  • 好吧,它是从什么事件触发的..这是在Load还是在回发期间发生的..我认为你可以像我提到的那样直接绑定而不使用 List例如,关于加载 ddl..,您从哪里获取数据或从哪里读取数据?我认为有一个更简单的方法
  • 我将它绑定在 ViewLoad 上,我正在演示器中构建列表,而不是在视图上对其进行硬编码。
  • 我认为您无论如何都不会理解,请查看我之前/之前评论中发布的链接,您显然做错了,我不是在谈论硬编码

标签: c# asp.net mvp system.web.ui.webcontrols


【解决方案1】:

在遇到这个问题后,我也调试了 ASP.NET 源代码,并在 ASP.NET 源代码中发现了一个缺陷(?)(因此,我们的问题的解决方案):

在内部,System.Web.UI.WebControls.Listcontrol 缓存最近使用的SelectedValue。因此,当在SelectedValue 已经从Request.Form[] 设置之后发生数据绑定(它本机清除SelectedValue 属性)时,数据绑定操作会尝试查找并预选先前缓存的项目。不幸的是,当在新的DataSource 列表中找不到缓存的值而不是静默地留下当前的SelectedValue null 值时,它会引发异常。

我猜他们这样做是因为在使用ViewState数据源对象进行数据绑定时,后面的数据绑定操作会删除Request.Form[]获得的SelectedValue

因此,每当您在页面生命周期内对ListControl 执行多个数据绑定操作并且数据源不同时,就会发生此异常。


这是 ASP.NET 代码概要:

    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 不为空时才需要。)

【讨论】:

    【解决方案2】:

    嗯,这是一个超出范围的异常。在绑定到 DropDownList 之前,您是否将 SelectedIndex 设置为默认值?

    【讨论】:

    • 这应该更像是一条评论
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多