在 GridView 中添加新行找不到引用

Add New Row in GridView cannot find reference

我有一个可编辑的 GridView,但我还想有一个添加新行的功能,所以我为所有可编辑字段制作了一个使用 FooterTemplate 的按钮,并设置了 CommandName="AddNew" 。在前端一切看起来都符合预期,但是添加新行根本找不到 txtGrantIdtxtPotIdtxtBudget 并抛出 System.NullReferenceException 'Object reference not set to an instance of an object.'。问题必须在后面的代码中,但我也附加了前端。数据源很长,但确实调用了 OnRowCommand="gvPotsMoneyGrants_RowCommand"

ASPX

<%--Primary Key LinkId--%>
    <asp:TemplateField HeaderText="LinkId" SortExpression="LinkId">
        <ItemTemplate>
            <asp:Label ID="lblLinkId" runat="server" Text='<%# Eval("LinkId") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

<%--GrantId--%>
<asp:TemplateField HeaderText="GrantId" SortExpression="GrantId">
    <ItemTemplate>
        <asp:Label ID="lblGrantIdMain" runat="server" Text='<%#Eval("GrantId") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtGrantId" runat="server" Text='<%#Bind("GrantId") %>'></asp:TextBox>
    </EditItemTemplate>
    <FooterTemplate>
        <asp:TextBox ID="inGrantId" Width="120px" runat="server" />
        <asp:RequiredFieldValidator ID="vGrantId" runat="server" ControlToValidate="inGrantId" Text="?" ValidationGroup="VG5" />
    </FooterTemplate>
</asp:TemplateField>

<%--PotId--%>
<asp:TemplateField HeaderText="PotId" SortExpression="PotId">
    <ItemTemplate>
        <asp:Label ID="lblPotIdMain" runat="server" Text='<%#Eval("PotId") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtPotId" runat="server" Text='<%#Bind("PotId") %>'></asp:TextBox>
    </EditItemTemplate>
    <FooterTemplate>
        <asp:TextBox ID="inPotId" Width="120px" runat="server" />
        <asp:RequiredFieldValidator ID="vPotId" runat="server" ControlToValidate="inPotId" Text="?" ValidationGroup="VG5" />
    </FooterTemplate>
</asp:TemplateField>

<%--Budget--%>
<asp:TemplateField HeaderText="Budget" SortExpression="Budget">
    <ItemTemplate>
        <asp:Label ID="lblBudgetMain" runat="server" Text='<%#Eval("Budget") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtBudget" runat="server" Text='<%#Bind("Budget") %>'></asp:TextBox>
    </EditItemTemplate>
    <FooterTemplate>
        <asp:TextBox ID="inBudget" Width="120px" runat="server" />
        <asp:RequiredFieldValidator ID="vBudget" runat="server" ControlToValidate="inBudget" Text="?" ValidationGroup="VG5" />
    </FooterTemplate>
</asp:TemplateField>

代码隐藏

 protected void gvPotsMoneyGrants_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName.Equals("AddNew"))
        {
            TextBox txtGrantId = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("txtGrantId");
            TextBox txtPotId = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("txtPotId");
            TextBox txtBudget = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("txtBudget");
        string GrantId, PotId, Budget;

        GrantId = txtGrantId.Text;
        PotId = txtPotId.Text;
        Budget = txtBudget.Text;

        SqlCommand cmd = new SqlCommand();
        cmd.Parameters.AddWithValue("GrantId", GrantId);
        cmd.Parameters.AddWithValue("PotId", PotId);
        cmd.Parameters.AddWithValue("Budget", Budget);

    }
}

请尝试下面的代码。

protected void gvPotsMoneyGrants_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName.Equals("AddNew"))
    {
        TextBox inGrantId = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("inGrantId");
        TextBox inPotId = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("inPotId");
        TextBox inBudget = (TextBox)gvPotsMoneyGrants.FooterRow.FindControl("inBudget");
    string GrantId, PotId, Budget;

    GrantId = inGrantId.Text;
    PotId = inPotId.Text;
    Budget = inBudget.Text;

    SqlCommand cmd = new SqlCommand();
    cmd.Parameters.AddWithValue("GrantId", GrantId);
    cmd.Parameters.AddWithValue("PotId", PotId);
    cmd.Parameters.AddWithValue("Budget", Budget);

    }
}