我一直在标题行中得到上述错误,这没有任何意义,因为我使用的样本表只有5条记录,每条记录都有一个按照下拉菜单的值。
这是我用来声明下拉列表的代码。我在SQL数据源中加入了两个表来反映我想要在网格视图中填充的内容,并根据需要隐藏列。我使用相同的数据源填充下拉列表,任何帮助将是最受欢迎的
<asp:DropDownList ID="DropDownListCurrency" runat="server"
CausesValidation="True" DataSourceID="GridView"
DataTextField="Currency" DataValueField="Currency_ID"
AppendDataBoundItems="True">
<asp:ListItem Value="0" Text="<Select>" 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);
}
}
答案 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)
如果下拉列表中的行位于相关表中且数据库中未使用参照完整性,则会发生这种情况。在我的例子中,我使用参照完整性,但我在下拉列表记录中添加一个布尔值来表示“已禁用” - 即我不再希望用户能够在下拉列表中选择此值。所以我过滤下拉列表只显示不是“已禁用”的值,但问题是现有数据可能已包含该值,导致在网格上按下编辑时上面的错误消息。
我处理这种情况的方式如下:
在后面的代码中添加以下代码:
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;
}
不要忘记在DropDownList_OnSelectedIndexChanged或GridViewOnRowUpdating中编写代码,以将值更新回数据源(作为其未绑定字段)。
向EditItemTemplate添加自定义验证器,以确保无法输入已删除的数据,即用户必须更改下拉列表中的值才能保存。
这听起来很复杂,但提供此功能是一种非常直接的方式,除非有人有更好的想法......
答案 5 :(得分:0)
在ASPX中将Text
的{{1}}属性设置为DropDownList
中丢失的值会导致相同的错误。
就我而言,发生的事情是我错误地添加了ItemList
标记,其中meta-resourcekey
属性设置为Text
中缺少的值。
资源价值是:
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;
和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();