& # 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?

我的原始代码

& # 39; DropDownList1& # 39;有一个无效的SelectedValue,因为它不存在于项目列表中

"所以,一个解决方案是从字符串中删除空格(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>