【问题标题】:asp:DropDownList Error: 'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of itemsasp:DropDownList 错误:“DropDownList1”有一个无效的 SelectedValue,因为它不存在于项目列表中
【发布时间】:2008-09-01 23:30:10
【问题描述】:

我有一个带有许多 asp:DropDownList 控件的 asp.net 2.0 网站。 DropDownList 控件包含标准信息城市、州、县等...信息。 除了标准代码外,该站点还具有用户可以自己配置的自定义代码。 例如,动物下拉菜单可能包含值 Dog、Cat、Fish 等...

我正在从我创建的 SQL 2005 表中填充 DropDownList,例如tbl代码

一切都很好,用户可以使用众多 DropDownList 控件添加订单以从列表中选择项目。

如果用户想要更改他们的自定义下拉菜单之一,就会出现问题。例如,用户想要更改动词 在从 Dog 到 K9 的动物类型对照上。这就是问题的开始。

对于所有新订单,下拉菜单都可以正常工作。当用户检索到旧订单时 我在 C# 代码隐藏中收到以下错误 “'DropDownList1' 有一个无效的 SelectedValue,因为它不存在于项目列表中。”

发生的情况是旧订单的数据库字段值为 Dog,并且 DropDownList 的列表中不再有 Dog,因为用户将其更改为 K9。

关于解决方法的任何想法?
有没有办法让 asp:DropDownList 接受未在其列表中播种的项目? 我可以使用其他控件吗?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    我在两天前解决了这个完全相同的问题。首先,我将设置 SelectedValue 的代码移至 DropDownList 的 PreRender 处理程序。然后,我添加逻辑以首先检查该值是否在下拉列表中。如果没有,我添加它。

    这是我的代码。 ddSpecialty 是我的下拉列表,其中填充了数据库中的“专业”。 registration.Specialty 是用户选择的专业,它可能在下拉列表中,也可能不在下拉列表中,因为自从他们上次选择后,该特定专业可能已被删除。

    protected void ddSpecialty_PreRender(object sender, EventArgs e)
    {
        if (!ddSpecialty.Items.Contains(new ListItem(registration.Specialty)))
            ddSpecialty.Items.Add(registration.Specialty);
        ddSpecialty.SelectedValue = registration.Specialty;
    }
    

    【讨论】:

      【解决方案2】:

      我非常喜欢以下用于设置 DropDownList 值的小 sn-p:

      对于非数据绑定(例如手动添加的项目):

      ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
      

      对于数据绑定

      ddl.DataBound += (o,e) => ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
      

      我确实希望当您尝试将值设置为不存在的东西时 ListControls 通常不会引发错误。至少在发布模式下,让它安静地死掉会很好。

      【讨论】:

        【解决方案3】:

        您的 SelectedValue 应该是某种唯一的 id,不会改变。显示给用户的 Text 值是单独的,可以在必要时更改而不会影响您的应用程序,因为您将 id 与您的 Order 相关联,而不是显示的字符串值。

        【讨论】:

          【解决方案4】:

          我不确定这是不是同一个问题,但我在尝试绑定我想包含在 GridView 中的 DropDownList 时遇到了类似的问题。当我环顾四周时,我发现很多人都在问类似的问题,但没有可靠的解决方案。我确实阅读了有关您是否可以拦截数据绑定等事件的相互矛盾的报告。我尝试了其中的大多数,但我找不到拦截或先发制人的方法。

          我最终创建了一个 ddl 的子类,从那里拦截了错误并进行了修复。

          不整洁,但它满足我的需求。我将代码放在我的博客上,以防万一。 link text

          【讨论】:

          • 链接已损坏。将解决方案放在这里或删除答案。
          【解决方案5】:
          【解决方案6】:

          我自己遇到了这个。奇怪的是,ddl.ClearSelection(); 没有用。不得不使用ddl.SelectedValue = null

          还注意到,这必须在我从列表 ddl.Items.Clear(); 中清除项目之后出现,这也看起来很奇怪。将 SelectedValue 设置为 null,然后清除项目仍然会引发错误。

          完成后,重新绑定列表并使用新值重新选择。

          【讨论】:

            【解决方案7】:

            试试这个:

            if (ddl.Items.Contains(new ListItem(selectedFacility)))
                ddl.SelectedValue = selectedFacility;
            

            【讨论】:

              【解决方案8】:

              在经常遇到这个问题后,我做了一个解决方法。不幸的是,MS 仍然没有恢复这个问题。

              无论如何,我的解决方法如下。

              1) 我将数据绑定到 DropDownList 的 ToolTip 属性

              <asp:DropDownList ID="edtDepartureIDKey" runat="server" CssClass="textbox" 
              ToolTip='<%# Eval("DepartureIDKey") %>' DataSource="<%# DLL1DataSource() %>" DataTextField="DisplayField" DataValueField="IDKey"
              onprerender="edtDepartureIDKey_PreRender">
              

              2) 在预渲染事件中,我检查数据的可用性,如果它不在列表中,我只需添加它,然后将 selectedindex 设置为我保存在 ToolTip 属性中的数据值

              protected void edtDepartureIDKey_PreRender(object sender, EventArgs e)
              {
                  DropDownList ddl = (sender as DropDownList);
                  if (ddl.Items.FindByValue(ddl.ToolTip) == null)
                  {
                      //I am pulling Departure Data through the ID which is saved in ToolTip, and insert it into the 1st row of the DropDownList
                      TODepartureData v = new TODepartureData(DBSERVER.ConnStrName);
                      TODeparture d = v.Select(Convert.ToInt32(ddl.ToolTip));
                      ddl.Items.Insert(0, new ListItem(d.DeptCode, ddl.ToolTip));
                  }
                  ddl.Items.FindByValue(ddl.ToolTip).Selected = true;
              }
              

              【讨论】:

                猜你喜欢
                • 2015-11-02
                • 2010-11-21
                • 2014-01-14
                • 2011-08-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多