我正在尝试从GridView1访问文本框值,以便我可以在另一个名为“BILL”的窗口中使用它
public void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.Equals("Pay"))
{
GridViewRow row = (sender as Control).NamingContainer as GridViewRow;
//cannot use RowIndex
string fname = ((TextBox)row.FindControl("txtForename")).Text.Trim();
Response.Redirect("~/Bill.aspx?lblF=" + fname);
}
}
此代码来自主页,我想从文本框中获取值并将其设置为字符串。单击“pay”按钮时,该值应转移到“BILL”页面,转换为标签lblF的值。
当我运行程序并单击“付款”按钮时,它会输出错误'对象引用未设置为对象的实例'。这意味着字符串fname为空。但我很困惑为什么?
html代码:
OnrowCommand="GridView1_RowCommand" OnRowEditing="GridView1_RowEditing" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowUpdating="GridView1_RowUpdating" OnRowDeleting="GridView1_RowDeleting" BackColor="White" BorderColor="#006699" BorderStyle="Double" BorderWidth="3px" CellPadding="4" GridLines="Horizontal"
>
<Columns>
<asp:TemplateField HeaderText="Forename">
<ItemTemplate>
<asp:Label Text='<%# Eval("Forename") %>' runat="server" />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtForename" Text='<%# Bind("Forename") %>' runat="server"/>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtForeNameFooter" runat="server" />
</FooterTemplate>
</asp:TemplateField>
<Columns>
答案 0 :(得分:0)
获取命名容器的代码行返回null,因为发送方是GridView。这就是你得到错误的原因。在RowCommand事件中使用e.Row
已经可以使用该行。
此外,当您单击“付款”按钮时,该行可能不处于编辑模式。您正在寻找的文本框仅在行处于编辑模式时才会出现。当行不处于编辑模式时,ItemTemplate控件将呈现,这是标记中的标签控件。
你应该检查一下行。 FindControl("txtForename")
为null,如果是,则查找同一列的标签控件。但是,您应该在ItemTemplate中为标签控件提供一个id,现在标记中缺少该ID。
您的代码还有其他问题。
RowCommand
事件中,因此您只需使用e.Row
就可以访问该行,而无需使用NamingContainer逻辑。 using(con)
是数据库,则con
不起任何作用
连接对象,因为您没有连接到任何数据库,只是简单地重定向到另一个页面。带标签控件的标记
<asp:TemplateField HeaderText="Forename">
<ItemTemplate>
<asp:Label ID="lblForename" Text='<%# Eval("Forename") %>' runat="server" />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtForename" Text='<%# Bind("Forename") %>' runat="server"/>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtForeNameFooter" runat="server" />
</FooterTemplate>
</asp:TemplateField>
用于获取forename文本的C#代码
if (e.CommandName.Equals("Pay")) {
//you don't need NamingContainer to get Row in RowCommand event
//since its already available under the GridViewCommandEventArgs object
//you can get the GridViewRow using the line below
GridViewRow row = (e.CommandSource as Control).NamingContainer as GridViewRow;
if (row != null) {
string fname = null;
//check if row is in edit mode by checking if textbox exists
if (row.FindControl("txtForename") != null) {
fname = ((TextBox) row.FindControl("txtForename")).Text.Trim();
} else {
fname = ((Label) row.FindControl("lblForename")).Text.Trim();
}
Response.Redirect("~/Bill.aspx?lblF=" + fname);
}
}
}