asp:DropDownList错误:" DropDownList1"具有一个SelectedValue无效,因为它不存在于项目列表中

时间:2020-03-05 18:46:10  来源:igfitidea点击:

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

我正在从创建的SQL 2005表中填充DropDownList tblCodes

一切正常,用户可以使用众多DropDownList控件从列表中选择商品来添加订单。

如果用户想要更改其自定义下拉菜单之一,则会出现问题。例如,用户想要更改语言
在从Dog到K9的动物类型控件上。这是问题开始的地方。

对于所有新订单,下拉列表都可以正常工作。当用户检索到旧订单时
我在Ccodebehind中收到以下错误
"'DropDownList1'的SelectedValue无效,因为它不存在于项目列表中。"

发生的是,旧订单的数据库字段值为Dog,并且自用户将其更改为K9以来,DropDownList的列表中不再包含Dog。

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

解决方案

回答

SelectedValue应该是某种唯一的ID,并且不会改变。向用户显示的Text值是单独的,并且可以在不影响应用程序的情况下进行更改,因为我们将ID与Order(而不是显示的字符串值)相关联。

回答

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

这是我的代码。 ddSpecialty是我的下拉列表,其中填充了数据库中的" specialties"。注册。专业是用户选择的专业,它可能会或者可能不在下拉菜单中,因为该特定专业可能是自上次选择以来就已删除。

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值的小片段:

对于非DataBound(例如,手动添加的项目):

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

对于DataBound:

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

我当然希望,当我们尝试为不存在的东西设置值时,ListControls通常不会抛出错误。无论如何,至少在发布模式下,让它安静地死掉还是不错的。