【问题标题】:Null Exception declaring gridview in codebehind在代码隐藏中声明 gridview 的空异常
【发布时间】:2015-09-25 19:07:22
【问题描述】:

此问题的部分原因是在 FormView 中嵌入 GridView 并在 GridView 控件上运行 SQL。

GirdView 标记:

<asp:GridView ID="gvBFProd" runat="server" ShowFooter="True" AutoGenerateColumns="False" DataKeyNames="BFProdID" DataSourceID="BFProdSQL" OnRowCommand="gvBFProd_RowCommand">
            <Columns>
                <asp:TemplateField ShowHeader="False">
                    <EditItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Save"></asp:LinkButton>
                        &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:LinkButton ID="ButtonAdd" runat="server" CommandName="FooterInsert" Text="Insert"  />
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
                        &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
...

代码隐藏

private GridView gvBFProd;
    protected void gvBFProd_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        gvBFProd = FormView1.Row.FindControl("gvBFProd") as GridView;

        if (e.CommandName == "FooterInsert" && Page.IsValid)
        {
            // Reference GridView Controls
            TextBox txtBFID = (TextBox)FormView1.Row.FindControl("txtBFID");
            DropDownList ddlSeries =
                (DropDownList)gvBFProd.FooterRow.FindControl("ddlFooterSeries");
            TextBox txtACMWelders =
                (TextBox)gvBFProd.FooterRow.FindControl("txtFooterACMWelders");
....                

// Update InsertParameters
            BFProdSQL.InsertParameters.Clear();

            BFProdSQL.InsertParameters.Add("BFID", txtBFID.Text);
            BFProdSQL.InsertParameters.Add("SeriesID", ddlSeries.SelectedValue);
            BFProdSQL.InsertParameters.Add("NumACMWelders", txtACMWelders.Text);
...         


// Insert new record
            BFProdSQL.Insert();
        }
    }

最初的private GridView gvBFProd; 是必要的,因为它被嵌入在FormView 中,以便为GridView 控件引用提供上下文。但是,要么某些事情没有正确传递,要么我需要对 private GridView gvBFProd; 行做更多的事情。我在想后者,因为一旦项目建成,我在 gvBFProd 下得到绿色波浪线,说明该字段从未分配给,并且始终具有其默认值 null。当然,当我单击插入链接按钮时,我会收到一个未处理的空异常错误,该错误在 (DropdownList)gvBFProd.FooterRow.... 行处中断。

我是否需要为 gvBFProd 构建 get/set 函数,或者是否有不同的方式来传递 GridView?

【问题讨论】:

  • 你为什么要声明“private GridView gvBFProd;”??
  • gvBFProd 将已在设计器文件中声明
  • 也许在你的文件中声明它是从后面的代码中隐藏 gvBFPROD。而且由于您从不初始化它,因此当您尝试访问它的属性时,您可以创建一个 ER。删除该声明,看看它是否有效。
  • 当我删除“private GridView gvBFProd;”然后我在所有 Control 声明下得到红色波浪线,表示 gvBFProd 在此上下文中不存在。如果我将 GridView 移到 块之外,这不是问题,但是当 GridView 嵌套在 FormView 中时,我会收到上下文错误。因此,gvBFProd 声明。如果有更好的解决方案来解决上下文错误,我也完全赞成。
  • 我开始觉得有些事情不对劲。我拿出了“私有 GridView gvBFProd;”行并将我的 GridViews 移到 FormView 的上下文之外。现在,当单击“插入”按钮时,我的第一行 InsertParameters.Add() 出现空引用异常错误,说明对象引用未设置为对象的实例。这不是我在更新参数代码上方的 //Reference GridView Controls 部分所做的吗?

标签: c# asp.net gridview


【解决方案1】:

找到导致原始 Null Exception 错误的原因。我在代码隐藏中缺少 gvBFProd 的定义。

具体来说:

private GridView gvBFProd;
    protected void gvBFProd_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        gvBFProd = FormView1.Row.FindControl("gvBFProd") as GridView;
....

现在我的下拉列表中出现了一个不同的空引用异常,但这是一个不同的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-09-07
    • 2014-09-09
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多