从另一个类中使用的GridView文本框的ASP.NET值?

时间:2017-11-11 13:06:32

标签: c# asp.net gridview

我正在尝试从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>

1 个答案:

答案 0 :(得分:0)

获取命名容器的代码行返回null,因为发送方是GridView。这就是你得到错误的原因。在RowCommand事件中使用e.Row已经可以使用该行。

此外,当您单击“付款”按钮时,该行可能不处于编辑模式。您正在寻找的文本框仅在行处于编辑模式时才会出现。当行不处于编辑模式时,ItemTemplate控件将呈现,这是标记中的标签控件。

你应该检查一下行。 FindControl("txtForename")为null,如果是,则查找同一列的标签控件。但是,您应该在ItemTemplate中为标签控件提供一个id,现在标记中缺少该ID。

您的代码还有其他问题。

  • 当您执行C#代码时,您处于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);
  }
 }
}