'DropDownList1' 有一个无效的 SelectedValue,因为它不存在于项目列表中。参数名称:值

'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value

我在 GridView 中使用 TemplateField 从数据库中实现 edit/delete

我正在使用 SqlDataSource 控件查询数据。

当我从页面编辑 Table 时,出现以下错误:

'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value

这是因为来自 dB 的数据不匹配任何 DropDownList 国家名称。

我明白了这个问题question (那里没有给出解决方案!)

我认为当我向 dB 插入数据时,它会自动向数据添加冗余空格(如国家名称)

因此,一种解决方案是从字符串中删除空格 (Trim),以便在 DropDownList 项之一中匹配值。

因为<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Eval("Country")%>'
不匹配 DropDownList

的任何列表项

但是

<asp:DropDownList ID="DropDownList1" runat="server"  SelectedValue='<%# Eval("Country").ToString().Trim()%>'>

匹配DropDownList的列表项。

现在我想将数据更新回数据库,但存储的不是国家名称空值。 (我觉得是Eval()的限制)

我可以使用 Bind() 将数据更新回 dB 但是 Bind 不支持 ToString().Trim() 所以我不能 trim 字符串来匹配 DropDownList 中的一项。

如何将数据更新回 dB?

我的raw code

"So, one solution is to remove the spaces (Trim) from String so that value get matched in DropDownList fields."

我有点困惑为什么这会有所作为。

您能否向我们展示此 DropDownList 控件创建的原始 HTML,以及您要编辑的行。

查看原图HTML..

  • 在 Chrome
  • 中打开您的网页
  • 按 F12 显示开发者选项
  • 现在,右键单击您网页上的下拉列表,然后select "Inspect Element"
  • 在 Chrome 的开发人员 window 的“元素”选项卡中,您会看到一个 select 元素,这是 ASP.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 中列出的 value 之一不匹配.

更新

查看您的 .aspx 文件后,我看到您显示了一个国家/地区名称列表,但是 none 有一个值:

<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 检查您的国家/地区名称下拉列表 do 中是否有 Value。如果他们没有,这将解释您看到的错误。)

更新 2

我从提出同样问题的许多其他 Whosebug 问题之一窃取了以下提示:

尝试将以下内容添加到您的 edittemplate 中以查看当前值:

<asp:Label ID="lblCountryName" runat="server" Text='<% #Bind("Country") %>'></asp:Label>

Taken from here

这应该会告诉您 Value 它正在尝试在您的 DropDownList 控件创建的 option 项列表中查找,但找不到。

使用这个:

<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>

摸索了几个小时后,终于找到了尾随spaces问题的优雅解法。

在我的 Table 定义中,在 Country 字段定义中我使用 nchar(100) 而不是 nvarchar(100)。前者始终有 100 个字符(因此尾随 spaces),后者最多可以有 100 个字符,但不会填满 space(因此匹配 DropDownlist 中的项目).

简而言之,<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind("Country")%>'> 现在工作正常。

希望对以后的读者有所帮助。