我已经写了一些代码,做一个GridView的批量更新。 在我的模板领域的GridView的一个具有下降downlist:
<asp:DropDownList ID="DDLCategories" runat="server"
DataSourceID="odsCategories" DataTextField="txtCategory"
DataValueField="intCategoryID" SelectedValue='<%# Bind("intCategoryID") %>'>
<asp:ListItem Text="Please Select an item" Value ="-1"></asp:ListItem>
</asp:DropDownList>
在我的数据库我有800条记录。 但是只有极少数的已分配“intCategoryID”的价值。 其余的都是NULL。
批量更新的全部原因是更新所有的“intCategoryID”字段和分配类别ID给每个记录。
因为不是所有的OD“intCategoryID”已分配的值,我得到一个错误,当我尝试渲染页面。 下拉列表失败。 这里是信息:
'DDLCategories' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value
有没有一种方法,我可以将空类别有“-1”我在下拉列表中创建一个值的列表项? 也就是说,如果“intCategoryID” ISNULL则有“请选择一个项目”选择,否则选择选择的值。
看看这篇文章 。 它覆盖了DDL和失踪的SelectedValue检查装订方法。 您可能需要如果你不使用一个FormView修改它,但我想你会得到一个良好的开端与该职位。
我试图给你指给我看的代码转换,但我仍然只有新的C#和ASP.NET为此我有一些错误。
你所指出的代码是指一个FormView,但是我特林将其更改为一个gridview。
这是我到目前为止的代码:
protected void GridView1_PreRender(object sender, EventArgs e)
{
DataRowView rowView = (DataRowView)(GridView1.DataItem);
if ((rowView != null) &&
((DropDownList)(GridView1.FindControl("DDLCategories")).Items.FindByValue(rowView["intCategoryID"].ToString()) != null));
{
(DropDownList)(GridView1.FindControl("DDLCategories")).SelectedValue = rowView["Category"].ToString();
}
}
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
e.NewValues["intCategoryID"] = (DropDownList)(GridView1.FindControl("DDLCategories")).SelectedValue;
}
能否请您指出,当我产生错误。
最简单的办法就是让AppendDataBoundItems并添加对应于一个空的INTEM。 它可能具有的“-1”或其他任何价值,你是不是在你的列表值的价值。 现在,所有你需要做的就是让有条件的约束力:
(Eval("intCategoryID") != null && Eval("intCategoryID").ToString().Length>0) ? Eval("intCategoryID").ToString() : "-1"
为了解决这个问题,你可以创建自定义的DropDownList服务器控件。
using System.Web.UI.WebControls;
namespace CustomNamespace
{
// Dropdownlist which does not throw an exception if SelectedValue does not exist
public class CustomDropdownList : DropDownList
{
protected override void PerformDataBinding(System.Collections.IEnumerable dataSource)
{
try
{
base.PerformDataBinding(dataSource);
}
catch (System.ArgumentOutOfRangeException)
{
}
}
}
}
然后,使用自定义下拉列表的aspx页面上代替。 如果你的项目被称为“CustomProject”,添加这个在aspx文件的第二行:
<%@ Register assembly="CustomProject" namespace="CustomNamespace" tagprefix="custom" %>
然后替换为自定义的所有下拉列表标签实例:
<custom:CustomDropdownList ID="ddlId" runat="server" SelectedValue='<%# Bind("column") %>' DataSourceID="dataSourceDropdown" DataTextField="field" DataValueField="value" />