【问题标题】:'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value“DropDownList1”有一个无效的 SelectedValue,因为它不存在于项目列表中。参数名称:值
【发布时间】:2015-11-02 08:13:06
【问题描述】:

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

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

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

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

这是由于来自 dB 的数据与任何 DropDownList 国家/地区名称都不匹配。

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

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

因此,一种解决方案是从 String 中删除空格(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(),所以我无法修剪字符串以匹配 DropDownList 中的一项。

如何将数据更新回 dB?

我的raw code

【问题讨论】:

  • 在将DataSource 设置为GridView 之前绑定DropDownList1。显示您的代码,在其中填充 GridView。
  • 试试SelectedItem='&lt;%# Eval("Country").ToString().Trim()%&gt;'
  • @user3540365 SelectedItem 没有工作..仍然是空值
  • @A_Sk 你的解决方案解决了我的问题

标签: c# asp.net gridview data-binding sqldatasource


【解决方案1】:

“因此,一种解决方案是从字符串中删除空格(Trim),以便 DropDownList 字段中的值得到匹配。”

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

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

查看原始 HTML..

  • 在 Chrome 中打开您的网页
  • 按 F12 显示开发者选项
  • 现在,右键单击网页上的下拉列表,然后选择“检查元素”
  • 在 Chrome 的开发者窗口的 Elements 选项卡中,您会看到一个 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>

...您看到的错误表明,当您单击其中一行时,其值与options 中列出的values 之一不匹配。

更新

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

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

Taken from here

这应该告诉你Value 它试图在你的DropDownList 控件创建的option 项目列表中查找但无法找到。

【讨论】:

  • 这是我的代码ideone.com/q9gqyF,只有当我点击编辑按钮时才会显示下拉列表
  • 请参阅上面对我的回答的“更新”。
  • 对于中国国家,我从 chrome 中国得到这个
  • 我将所有字段的代码更新为 North Korea 但仍然是同样的问题
  • 并且使用 Eval() 没有任何好处,因为我无法将值更新回 dB
【解决方案2】:

在摸索了几个小时后,我终于找到了尾随空格问题的优雅解决方案。

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

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

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

【讨论】:

  • 非常感谢。我犯了同样的错误,直到我阅读了这篇文章并清除了数据库表中的尾随空格。
【解决方案3】:

使用这个:

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

【讨论】:

  • 我们也要修剪空格!
  • 你能说什么Eval("Country") 获得价值吗??
  • 我认为它正在获取字符串但有多余的空格,因为 '' 运行顺利。
  • 调试您的代码并查看Eval("Country") 的价值,同时绑定 GridView。
  • 我如何从 Eval("Country") 中看到价值?
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多