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

时间:2008-09-01 23:30:11

标签: asp.net

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

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

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

如果用户想要更改其中一个自定义下拉列表,则会出现问题。例如,用户想要更改废弃物 从狗到K9的动物类型控制。这就是问题的出发点。

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

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

关于变通方法的任何想法?
有没有办法让asp:DropDownList接受没有在其列表中播种的项目? 我可以使用另一个控件吗?

8 个答案:

答案 0 :(得分:6)

两天前我解决了同样的问题。首先,我将设置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;
}

答案 1 :(得分:5)

我非常喜欢以下用于设置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一般不会在你尝试将值设置为不存在的东西时抛出错误。至少在发布模式下,如果悄然死亡,这将是很好的。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

我最终创建了ddl的子类,拦截了修复错误。

不整洁,但它符合我的需要。我把代码放在我的博客上以防万一。 link text

答案 4 :(得分:1)

答案 5 :(得分:0)

试试这个:

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

答案 6 :(得分:0)

自己跑进去。奇怪的是,ddl.ClearSelection();没有用。不得不使用ddl.SelectedValue = null

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

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

答案 7 :(得分:0)

我经常遇到这个问题后做了一个解决方法。不幸的是,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)在prerender事件中,我检查数据的可用性,如果它不在列表中,我只需添加它,然后将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;
}

how it looks