10

我在标题行中不断收到上述错误,这没有任何意义,因为我使用的示例表只有 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>

在此处输入图像描述

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);
    }        
}
4

9 回答 9

14

在尝试设置 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);
    }
}
于 2013-11-04T15:17:49.093 回答
5

这么简单就用这个

Dropdown.SelectedValue = null;
Dropdown.DataBind();
于 2017-04-18T09:31:02.660 回答
2

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

美元__ = 美元

或者

美元 = 美元__

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

于 2013-11-04T15:17:03.753 回答
0

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

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

  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 添加自定义验证器以确保无法输入已删除的数据,即用户必须更改下拉列表中的值才能保存。

这听起来很复杂,但提供此功能的方式非常简单,除非有人有更好的想法......

于 2014-11-19T20:21:36.153 回答
0

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

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

下拉列表找不到值 Emma1。

于 2014-11-03T23:45:27.370 回答
0

将ASPX 中的Text属性设置DropDownList为缺失值ItemList会导致相同的错误。

在我的情况下,发生的事情是我错误地添加了meta-resourcekey标签,其中Text属性设置为 value missing in ItemList

资源值是:

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(){
  
}
<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>

和 ASPX 控制是:

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

删除meta:resourcekey对我有用。

于 2018-04-10T06:22:43.030 回答
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
于 2019-05-29T11:32:17.057 回答
0

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

于 2021-05-05T08:40:57.603 回答
-1

您可以使用 Trim() 方法

ddlname.Text = dt.Rows[0][3].ToString().Trim();
于 2016-06-23T09:24:55.557 回答