使用后面的代码在 Gridview 中为 DropDownList 设置数据源时出错
Posted
技术标签:
【中文标题】使用后面的代码在 Gridview 中为 DropDownList 设置数据源时出错【英文标题】:Get error when set datasource for DropDownList in Gridview by using code behind 【发布时间】:2017-12-22 22:34:51 【问题描述】:我有一个 GridView 来显示我的产品,我还制作了 EditButton 和 DeleteButton 来更新和删除我在 GridView 中的产品。当我单击 EditButton 时,我的 gridview 有一个 DropDownList 来显示我的 ProductType 但我收到一条错误消息:
对象引用未设置为对象的实例
这张图片将显示我在哪里得到错误:
这是我用来为 DropDownList 填充数据源的方法:
感谢您的帮助!
<asp:GridView ID="gridviewSanPham" runat="server" DataKeyNames="ID" AllowPaging="True" PageSize="4" AutoGenerateColumns="False" OnPageIndexChanging="gridviewSanPham_PageIndexChanging" OnRowCancelingEdit="gridviewSanPham_RowCancelingEdit" OnRowDeleting="gridviewSanPham_RowDeleting" OnRowEditing="gridviewSanPham_RowEditing" OnRowUpdating="gridviewSanPham_RowUpdating" OnRowDataBound="gridviewSanPham_RowDataBound">
<Columns>
<asp:CommandField ButtonType="Button" ShowEditButton="true" ShowCancelButton="true" />
<asp:CommandField ButtonType="Button" ShowDeleteButton="true" ShowCancelButton="true" />
<asp:BoundField DataField="ID" HeaderText="Mã sản phẩm" ReadOnly="true"/>
<asp:TemplateField HeaderText="Mã Loại">
<ItemTemplate>
<%# Eval("TypeID") %>
</ItemTemplate>
<EditItemTemplate>
<asp:Label runat="server" ID="lblTypeID" Text='<%# Eval("TypeID") %>'></asp:Label>
<asp:DropDownList runat="server" ID="cboTypeID" ></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Tên SP">
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtName" Text='<%# Eval("Name") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Giá">
<ItemTemplate>
<%# Eval("Price") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtPrice" Text='<%# Eval("Price") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Mô tả">
<ItemTemplate>
<%# Eval("Description") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtDescription" Text='<%# Eval("Description") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Hình">
<ItemTemplate>
<%# Eval("Image") %>
</ItemTemplate>
<EditItemTemplate>
<asp:Label runat="server" ID="lblImage" Text='<%# Eval("Image") %>'></asp:Label>
<asp:FileUpload runat="server" ID="uploadImage" />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这是我的aspx代码
【问题讨论】:
What is a NullReferenceException, and how do I fix it?的可能重复 你能否添加一个屏幕截图来显示你的SqlDataAdapter
对象da
产生的值
请分享您的 gridview html 标记和 FillLoaIsp 代码。这将帮助我们确定根本原因。
您是否在 FindControl("cboTypeID") 中提供了正确的下拉 ID,因为从名称看来,您在此提供了复选框 ID。你能分享你的gridview HTML吗?
@Prabhat 是的,我给了我的图片以在我的问题中显示我的 FillLoaiSP 方法
【参考方案1】:
将你的Dopdownlist
绑定代码放入if ((e.Row.RowState & DataControlRowState.Edit) > 0)
RowDataBound
事件中:
protected void gridviewSanPham_RowDataBound(object sender, GridViewRowEventArgs e)
if (e.Row.RowType == DataControlRowType.DataRow)
// check if dropdownlist in edittemplate
if ((e.Row.RowState & DataControlRowState.Edit) > 0)
DropDownList drop = (DropDownList)e.Row.FindControl("cboTypeID");
drop.DataSource = FillLoaiSP();
drop.DataBind();
【讨论】:
感谢您的帮助。我会试试的 非常感谢您的帮助。你让我今天一整天都感觉很好。我确实喜欢你的代码,我的问题已经解决了。【参考方案2】:它总是会抛出错误,因为您试图在gridviewSanPham_RowDataBound
方法中查找下拉列表。只需尝试在gridviewSanPham_RowEditing
方法中找到下拉列表。因为在RowDataBound
事件中它将遍历所有行,包括页眉和页脚,所以在页眉和页脚行的情况下会抛出空对象引用错误。
在编辑操作的情况下,您的下拉菜单也会出现,因此您可以在gridviewSanPham_RowDataBound
方法中放置数据行和操作的过滤器。但强烈建议您在gridviewSanPham_RowEditing
方法中绑定下拉菜单。
【讨论】:
感谢您的帮助。我会试试的。以上是关于使用后面的代码在 Gridview 中为 DropDownList 设置数据源时出错的主要内容,如果未能解决你的问题,请参考以下文章
GridView、ItemTemplate、DataTemplate 绑定在 C# 代码后面
从后面的代码中过滤 TextBox 的 KeyPress 事件上的 GridView