我有一个带有大量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接受没有在其列表中播种的项目?
我可以使用另一个控件吗?
答案 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;
}