使用后面的代码在 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 &amp; DataControlRowState.Edit) &gt; 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 设置数据源时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在android gridview中为行设置不同的列

如何从后面的代码中的页面方法更新 GridView?

GridView、ItemTemplate、DataTemplate 绑定在 C# 代码后面

从后面的代码中过滤 TextBox 的 KeyPress 事件上的 GridView

无法在 schema.sql 中为 Spring Boot 应用程序使用“DROP TABLE IF EXISTS”

如何在 Asp.net c# 中为 GridView 行启用双击和单击