【问题标题】:Add new row to gridview not working inside repeater control向 gridview 添加新行在中继器控件中不起作用
【发布时间】:2019-05-18 13:59:49
【问题描述】:

我在中继器控件中使用 Gridview 来选择计费项目。

但是当我尝试在 gridview 中添加新行时,它会说:

“对象引用未设置为对象的实例。”

我正在使用 gridview 来显示项目详细信息,并有一个按钮可以将新行添加到 gridview。

下面是我添加新行的 c# 代码:

private void AddNewRowToGrid()
    {
        foreach (RepeaterItem rptrItems in rptrTables.Items)
        {
            GridView gvItems = (GridView)rptrTables.FindControl("grdOrder");
            int rowIndex = 0;
            if (ViewState["CurrentTable"] != null)
            {
                DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
                DataRow drCurrentRow = dtCurrentTable.NewRow();
                if (dtCurrentTable.Rows.Count > 0)
                {
                    for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                    {
                        DropDownList box1 = (DropDownList)gvItems.Rows[rowIndex].Cells[1].FindControl("drpItemname");
                        TextBox box2 = (TextBox)gvItems.Rows[rowIndex].Cells[2].FindControl("lblUnitPrice");
                        TextBox box3 = (TextBox)gvItems.Rows[rowIndex].Cells[3].FindControl("lblQuantity");
                        TextBox box4 = (TextBox)gvItems.Rows[rowIndex].Cells[4].FindControl("lblLineTotal");
                        drCurrentRow = dtCurrentTable.NewRow();
                        drCurrentRow["RowNumber"] = i + 1;
                        dtCurrentTable.Rows[i - 1]["ItemName"] = box1.Text;
                        dtCurrentTable.Rows[i - 1]["UnitPrice"] = box2.Text;
                        dtCurrentTable.Rows[i - 1]["Quantity"] = box3.Text;
                        dtCurrentTable.Rows[i - 1]["LineTotal"] = box4.Text;
                        rowIndex++;
                    }
                    dtCurrentTable.Rows.Add(drCurrentRow);
                    ViewState["CurrentTable"] = dtCurrentTable;
                    gvItems.DataSource = dtCurrentTable;
                    gvItems.DataBind();
                }
            }
            else
            {
                Response.Write("ViewState is null");
            }
            SetPreviousData();
        }        
    }

这是我的 aspx 标记:

<div class="card-body">
                                                    <div class="row">
                                                        <div class="col-md-12">
                                                            <div class="form-group">
                                                                <asp:GridView ID="grdOrder" runat="server" AutoGenerateColumns="false" AllowPaging="true" CssClass="table table-bordered table-hover table-responsive" GridLines="None" PageSize="10" OnRowDataBound="gvRowDataBound" ShowFooter="true">
                                            <Columns>
                                                 <asp:CommandField ShowDeleteButton="true" ControlStyle-CssClass="btn btn-danger fa fa-trash" DeleteText="" HeaderText="Remove" />
                                                <asp:BoundField DataField="RowNumber" HeaderText="Sl. No." />
                                                <asp:TemplateField HeaderText="Item Name">
                                                    <ItemTemplate>
                                                        <asp:DropDownList ID="drpItemname" runat="server" CssClass="form-control select2" OnSelectedIndexChanged="GetItemDetails" AutoPostBack="true"></asp:DropDownList>
                                                    </ItemTemplate>
                                                </asp:TemplateField>
                                                <asp:TemplateField HeaderText="Price">
                                                    <ItemTemplate>
                                                        <asp:TextBox ID="lblUnitPrice" runat="server" CssClass="form-control" Text='<%# Eval("UnitPrice")%>'></asp:TextBox>
                                                    </ItemTemplate>
                                                </asp:TemplateField>
                                                <asp:TemplateField HeaderText="Qty">
                                                    <ItemTemplate>
                                                        <asp:TextBox ID="lblQuantity" runat="server" TextMode="Number" CssClass="form-control" Text='<%# Eval("Quantity")%>'></asp:TextBox>
                                                    </ItemTemplate>
                                                </asp:TemplateField>                                               
                                                <asp:TemplateField HeaderText="Line Total">
                                                    <ItemTemplate>
                                                        <asp:TextBox ID="lblLineTotal" runat="server" CssClass="form-control" Text="0"></asp:TextBox>
                                                    </ItemTemplate>
                                                    <FooterStyle HorizontalAlign="Right" />
                                                <FooterTemplate>
                                                    <asp:Button ID="ButtonAdd" runat="server" CssClass="btn btn-primary" Text="Add" OnClick="AddItem" CausesValidation="False" />
                                                </FooterTemplate>                                                   
                                                </asp:TemplateField>                                        
                                            </Columns>
                                        </asp:GridView>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                                <div class="card-footer">
                                                    <div class="pull-right">
                                <asp:Button ID="btnSubmit" runat="server" CausesValidation="false" TabIndex="2" CssClass="btn btn-primary" Text="Print KOT" />
                                <asp:Button ID="Button1" runat="server" CausesValidation="false" TabIndex="2" CssClass="btn btn-primary" Text="Print Final Bill" />
                                <asp:Button ID="Button2" runat="server" CausesValidation="false" TabIndex="2" CssClass="btn btn-primary" Text="Complete Order" />
                            </div>
                                                </div>

如果所有数据在前一行中保持不变,我想向 gridview 添加新行!

【问题讨论】:

    标签: c# asp.net gridview row repeater


    【解决方案1】:
     DataRow drCurrentRow = null; 
    

    在这个地方你必须这样做

    DataRow drCurrentRow=  dtCurrentTable.NewRow();
    

    因为如果您在循环内使用 NeWRow,那么如果您的代码没有到达循环内,您的数据行对象将保留为空,在这种情况下,当

       dtCurrentTable.Rows.Add(drCurrentRow);
    

    此代码运行它尝试添加数据行实例,但未创建该实例,因为它在开始时分配为 null。 或者你可以试试

     dtCurrentTable.Rows.Add(drCurrentRow);
    

    也保持这个内部循环

    【讨论】:

    • 我试过但没有工作。它实际上在中继器之外工作,但不在中继器中!
    • 根据我 (GridView)rptrTables.FindControl("grdOrder");我猜这不是返回gridview。只需放置断点并检查gvitems是否有gridview
    • 是的,正如你所说,gridview 无法访问下拉列表控件,但即使我修改了代码,它仍然保持不变。
    • 我已经重新编辑了问题中的更新代码供您参考!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多