Asp.net asp:DropDownList错误:';下拉列表1';具有无效的SelectedValue,因为它不在项目列表中

Asp.net asp:DropDownList错误:';下拉列表1';具有无效的SelectedValue,因为它不在项目列表中,asp.net,Asp.net,我有一个asp.net 2.0网站,其中有许多asp:DropDownList控件。 该控制系统包含标准的信息城市、州、县等。。。信息。 除了标准代码外,该站点还具有用户可以自行配置的自定义代码。 例如,动物下拉列表可能包含狗、猫、鱼等值 我正在从我创建的SQL 2005表(例如tblCodes)中弹出DropDownList 一切都很好,用户可以使用大量的DropDownList控件添加订单,从列表中选择项目 如果用户想要更改其中一个自定义下拉列表,则会出现此问题。例如,用户希望更改详细信息

我有一个asp.net 2.0网站,其中有许多asp:DropDownList控件。 该控制系统包含标准的信息城市、州、县等。。。信息。 除了标准代码外,该站点还具有用户可以自行配置的自定义代码。 例如,动物下拉列表可能包含狗、猫、鱼等值

我正在从我创建的SQL 2005表(例如tblCodes)中弹出DropDownList

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

如果用户想要更改其中一个自定义下拉列表,则会出现此问题。例如,用户希望更改详细信息 关于从狗到K9的动物类型控制。问题就从这里开始

对于所有新订单,下拉列表都可以正常工作。当用户检索旧订单时 我在C#codebehind中得到了以下错误 “'DropDownList1'有一个SelectedValue,该值无效,因为它不在项目列表中。”

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

有什么解决办法吗?
有没有办法让asp:DropDownList接受列表中没有种子的项目?
还有其他控件可以使用吗?

您选择的值应该是某种类型的唯一id,不会改变。显示给用户的文本值是独立的,如果需要可以更改而不会影响应用程序,因为您将id与订单关联,而不是显示的字符串值。

我两天前刚刚解决了这个完全相同的问题。首先,我将设置SelectedValue的代码移动到DropDownList的预渲染处理程序。然后,我将逻辑添加到第一个检查中,以查看该值是否在下拉列表中。如果没有,我就加上

这是我的密码。ddSpecialty是我的下拉列表,由数据库中的“Specialities”填充。registration.Speciality是用户选择的专业,它可能在下拉列表中,也可能不在下拉列表中,因为该特定专业可能在用户上次选择后已被删除

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;
}

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

我最终创建了ddl的一个子类,从中截获了错误并进行了修复

虽然不整洁,但它满足了我的需要。我把代码放在我的博客上以防万一

试试这个:

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

我非常喜欢以下设置DropDownList值的小片段:

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

ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
对于数据绑定

ddl.DataBound += (o,e) => ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
我当然希望ListControls在尝试将值设置为某个不存在的值时不会抛出错误。不管怎样,至少在释放模式下,让它安静地死去是件好事。

检查以下内容:


我自己也遇到了这个问题。奇怪的是,
ddl.ClearSelection()不起作用。必须使用
ddl.SelectedValue=null

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


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

在经常遇到此问题后,我已经找到了解决方法。不幸的是,MS仍然没有恢复此问题

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

1) 我将数据绑定到DropDownList的工具提示属性

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

链接已断开。在此处放置解决方案或删除答案。
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;
}