【发布时间】: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>
<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>
<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 部分所做的吗?