& # 39; DropDownList1& # 39;有一个无效的SelectedValue,因为它不存在于项目列表中
本文关键字:于项目 列表 不存在 项目 有一个 DropDownList1 无效 因为 SelectedValue | 更新日期: 2023-09-27 18:07:06
我在GridView
中使用TemplateField
从数据库实现edit/delete
。
我正在用SqlDataSource
控件查询数据。
当我从页面编辑表时,我得到以下错误:
'DropDownList1'有一个无效的SelectedValue,因为它无效不存在于项目列表中。参数名称:value
这是由于来自dB的数据不匹配任何DropDownList
国家名称。
我从这个问题中理解了这个问题(这里没有给出解决方案)
我想当我插入数据到dB时,它会自动添加冗余空间到数据(如国家名称)
因此,一种解决方案是从字符串中删除空格(Trim),以便在DropDownList
项之一中匹配值。
因为<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Eval("Country")%>'
不匹配下拉列表
<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Eval("Country").ToString().Trim()%>'>
匹配DropDownList的列表项
现在我想将数据更新回数据库,但存储的不是国家名称空值。(我认为这是Eval()
的限制)
我可以使用Bind()
将数据更新回dB但是Bind
不支持ToString().Trim()
,所以我不能修剪字符串来匹配下拉列表中的一个项目。
如何将数据更新回dB?
我的原始代码
"所以,一个解决方案是从字符串中删除空格(Trim),以便value在DropDownList字段中得到匹配。"
我有点困惑,为什么这会产生不同。
你能给我们看一下这个下拉列表控件创建的原始HTML,以及你想编辑的那一行吗?
查看原始HTML..
- 在Chrome中打开网页
- 按F12显示开发人员选项 现在,右键单击网页上的下拉列表,选择"Inspect Element"
- 在Chrome的开发者窗口的元素选项卡中,你会看到一个
select
元素。Net为您创造的。展开这个元素,看到option
元素。 - 查看每一个的值属性。
你应该看到一个更复杂的版本…
<select id="listOfPeople">
<option value=""></option>
<option value="10">Mike</option>
<option value="17">Geoffery</option>
<option value="18">Edward</option>
</select>
…并且您看到的错误表明,当您单击其中一行时,其值与option
s中列出的value
s之一不匹配。
查看.aspx文件后,我看到您显示了一个国家名称列表,但没有一个具有Value:
<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Eval("Country").ToString().Trim()%>'>
<asp:ListItem>Select Country</asp:ListItem>
<asp:ListItem>India</asp:ListItem>
<asp:ListItem>USA</asp:ListItem>
<asp:ListItem>UK</asp:ListItem>
<asp:ListItem>China</asp:ListItem>
<asp:ListItem>North Korea</asp:ListItem>
<asp:ListItem>Kazakhstan</asp:ListItem>
</asp:DropDownList>
它们不应该是这样的吗?
<asp:ListItem Value="North Korea">North Korea</asp:ListItem>
…而不是这个…?
<asp:ListItem>North Korea</asp:ListItem>
(再次-使用Chrome来检查您的下拉列表的国家名称做有一个Value
在他们。如果没有,这将解释您看到的错误。)
更新2
我是从许多其他问过同样问题的StackOverflow问题中偷来的下面的技巧:
尝试在edittemplate
中添加以下内容以查看当前值:
<asp:Label ID="lblCountryName" runat="server" Text='<% #Bind("Country") %>'></asp:Label>
从这里取
这应该告诉你Value
,它试图寻找,并不能找到,在option
项目列表中,由您的下拉列表控件创建。
绞尽脑汁几个小时后,我终于找到了解决尾随空格问题的优雅方法。
在我的表定义中,在Country
字段定义中,我使用nchar(100)
而不是nvarchar(100)
。前者总是有100个字符(因此后面有空格),后者最多可以有100个字符,但不填充空格(因此匹配DropDownlist
中的项目)。
简而言之,<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind("Country")%>'>
现在运行良好。
use this:
<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Convert.ToString(Eval("Country"))%>'>
<asp:ListItem Value="">Select Country</asp:ListItem>
<asp:ListItem Value="India">India</asp:ListItem>
<asp:ListItem Value="USA">USA</asp:ListItem>
<asp:ListItem Value="UK">UK</asp:ListItem>
<asp:ListItem Value="China">China</asp:ListItem>
<asp:ListItem Value="North Korea">North Korea</asp:ListItem>
<asp:ListItemValue="Kazakhstan">Kazakhstan</asp:ListItem>
</asp:DropDownList>
因为值不一样male/male和female/female。它的案例问题。
<asp:ListItem>Select</asp:ListItem>
<asp:ListItem>Male</asp:ListItem>
<asp:ListItem>Female</asp:ListItem>
<asp:ListItem>Select</asp:ListItem>
<asp:ListItem>male</asp:ListItem>
<asp:ListItem>female</asp:ListItem>