DropDownList有一个SelectedValue,它是无效的,因为它在项列表中不存在。参数名称:value

时间:2013-11-04 14:44:20

标签: c# asp.net sql visual-studio-2010

我一直在标题行中得到上述错误,这没有任何意义,因为我使用的样本表只有5条记录,每条记录都有一个按照下拉菜单的值。

这是我用来声明下拉列表的代码。我在SQL数据源中加入了两个表来反映我想要在网格视图中填充的内容,并根据需要隐藏列。我使用相同的数据源填充下拉列表,任何帮助将是最受欢迎的

<asp:DropDownList ID="DropDownListCurrency" runat="server" 
                  CausesValidation="True" DataSourceID="GridView" 
                  DataTextField="Currency" DataValueField="Currency_ID" 
                  AppendDataBoundItems="True"> 

          <asp:ListItem Value="0" Text="&lt;Select&gt;" Enabled="True"></asp:ListItem>
</asp:DropDownList>

enter image description here

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    try 
    {
        GridViewRow row = GridView1.SelectedRow; 

        AccountNumber.Text = (string)row.Cells[0].Text;
        ....

        DropDownListCurrency.SelectedValue = (string)row.Cells[8].Text;
    }
    catch (Exception ex)
    {
        Console.WriteLine("{0} Exception caught.", ex);
    }        
}

9 个答案:

答案 0 :(得分:12)

在尝试设置SelectedValue之前尝试在下拉列表中找到值,如下所示:

if (DropDownListCurrency.Items.FindByValue(row.Cells[8].Text.ToString().Trim()) != null)
{
    DropDownListCurrency.SelectedValue = row.Cells[8].Text.ToString().Trim();
}

注意:Trim()调用将删除文本框文本中的任何前导或尾随空格,这可能导致找不到匹配项。

所以你的完整代码应该是这样的:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    try 
    {
        GridViewRow row = GridView1.SelectedRow; 

        AccountNumber.Text = (string)row.Cells[0].Text;
         ....

        if (DropDownListCurrency.Items.FindByValue(row.Cells[8].Text.ToString().Trim()) != null)
        {
            DropDownListCurrency.SelectedValue = row.Cells[8].Text.ToString().Trim();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("{0} Exception caught.", ex);
    }
}

答案 1 :(得分:3)

只需使用此

即可
Dropdown.SelectedValue = null;
Dropdown.DataBind();

答案 2 :(得分:2)

嗨,也许你的gridview中的那个单元格有空格或下拉列表有空格,例如这个不一样

Dolar__ = Dolar

Dolar = Dolar __

在后面的代码中使用Trim来清除SQL Server中的空白区域不要使用Rtrim这不是好的做法

答案 3 :(得分:0)

Dropdownlist值与数据库列中的值不同。

示例:下拉列表显示Emma,但数据库中存在Emma和Emma1。

下拉列表找不到值Emma1。

答案 4 :(得分:0)

如果下拉列表中的行位于相关表中且数据库中未使用参照完整性,则会发生这种情况。在我的例子中,我使用参照完整性,但我在下拉列表记录中添加一个布尔值来表示“已禁用” - 即我不再希望用户能够在下拉列表中选择此值。所以我过滤下拉列表只显示不是“已禁用”的值,但问题是现有数据可能已包含该值,导致在网格上按下编辑时上面的错误消息。

我处理这种情况的方式如下:

  1. 使有问题的下拉列表保持未绑定状态以避免错误。
  2. 在后面的代码中添加以下代码:

    protected void StaffTypeGridView_OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.DataRow ||
            e.Row.RowIndex != StaffTypeGridView.EditIndex) return;
    
        var staffType = (StaffType)e.Row.DataItem;
        var appCode = staffType.AppCode;
    
        var ddl = (DropDownList) e.Row.FindControl(ddlName);
        if (!string.IsNullOrEmpty(value) &&
            ddl.Items.FindByValue(value) == null)
        {
            ddl.Items.Add(new ListItem
            {
                Value = value,
                Text = value + " (Deleted)"
            });
        }
        ddl.SelectedValue = value;
    }
    
  3. 不要忘记在DropDownList_OnSelectedIndexChanged或GridViewOnRowUpdating中编写代码,以将值更新回数据源(作为其未绑定字段)。

  4. 向EditItemTemplate添加自定义验证器,以确保无法输入已删除的数据,即用户必须更改下拉列表中的值才能保存。

  5. 这听起来很复杂,但提供此功能是一种非常直接的方式,除非有人有更好的想法......

答案 5 :(得分:0)

在ASPX中将Text的{​​{1}}属性设置为DropDownList中丢失的值会导致相同的错误。

就我而言,发生的事情是我错误地添加了ItemList标记,其中meta-resourcekey属性设置为Text中缺少的值。

资源价值是:

&#13;
&#13;
ItemList
&#13;
table {
  border-collapse: collapse;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
table th, table td {
  border: solid 1px darkgray;
  padding: 0 5px;
}

table.tr:first(){
  
}
&#13;
&#13;
&#13;

和ASPX控制是:

<table css="table">
  <tr>
    <th>Name</th>
    <th>Value</th>
    <th>Comment</th>
  </tr>
  <tr>
    <td>Template.Text</td>
    <td>Template</td>
    <td></td>
  </tr>
  <tr>
    <td>Template.ToolTip</td>
    <td>template of standard outgoing email settings</td>
    <td></td>
  </tr>
</table>

删除 <asp:DropDownList runat="server" ID="ddlTemplate" CssClass="form-control dropdownlist" meta:resourcekey="Template" > <asp:ListItem Selected="True" meta:resourcekey="TemplateEmpty" Value="EMPTY" /> <asp:ListItem Selected="False" meta:resourcekey="TemplatePOP3" Value="POP3" /> <asp:ListItem Selected="False" meta:resourcekey="TemplatePOP3Secured" Value="POP3S" /> <asp:ListItem Selected="False" meta:resourcekey="TemplateIMAP" Value="IMAP" /> <asp:ListItem Selected="False" meta:resourcekey="TemplateIMAPSecured" Value="IMAPS" /> </asp:DropDownList> 对我有用。

答案 6 :(得分:0)

#region by zia for if item not exist in dropdownlist
                    string qlf = dsEmp.Tables["tblEmp"].Rows[0]["Group"].ToString();
                    ListItem selLqli = ddlGroup.Items.FindByText(qlf.Trim());
                    if (selLqli != null)
                    {
                        ddlGroup.ClearSelection();
                    }
                    else
                    {
                        ddlGroup.SelectedIndex = 0;

                    }
                    #endregion

答案 7 :(得分:0)

我在 db 中使用了 nvarchar(20) 作为数据类型,因为在 char 数据类型中,空间来了,所以包括空间在内的文本存在差异。也可以使用 Trim()。

答案 8 :(得分:-1)

您可以使用Trim()方法

ddlname.Text = dt.Rows[0][3].ToString().Trim();