无法在RowCreated上使用FindControl为Gridview找到控件

时间:2013-02-22 07:42:55

标签: c# asp.net gridview findcontrol

我正在使用gridview,这是我的模板字段之一:

<asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
    <HeaderTemplate>
        <asp:Label ToolTip="Quantity" runat="server" Text="Qty"></asp:Label>
    </HeaderTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txt_Quantity" runat="server" Text='<%# Bind("Quantity") %>' Width="30px"
            Enabled='True'></asp:TextBox>
    </EditItemTemplate>
</asp:TemplateField>

我想要达到像这样的txt_Quantity

    protected void begv_OrderDetail_RowCreated(object sender, GridViewRowEventArgs e)
    {
        TextBox txt_Quantity = (TextBox)e.Row.FindControl("txt_Quantity");
        txt_Quantity.Attributes.Add("onFocus", "test(this)");
    }

这是错误消息:

  

System.NullReferenceException:未将对象引用设置为实例   一个对象。

1 个答案:

答案 0 :(得分:2)

RowCreated是针对每个RowType执行的(顺便说一句,与RowDataBound相同),因此对于标题,数据行,页脚或寻呼机执行。

第一行是标题行,但TextBoxRowType = DataRow的行。由于它位于EditItemTemplate,您还必须检查EditIndex

protected void begv_OrderDetail_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (row.RowType == DataControlRowType.DataRow
       && e.Row.RowIndex == begv_OrderDetail.EditIndex)
    {
        TextBox txt_Quantity = (TextBox)e.Row.FindControl("txt_Quantity");
        txt_Quantity.Attributes.Add("onFocus", "test(this)");
    }
}

请注意,如果您枚举GridView的{​​{3}}属性,则只会获得RowType = DataRow的行,因此会省略页眉,页脚和分页器。所以这里不需要额外的检查:

foreach(GridViewRow row in begv_OrderDetail.Rows)
{
    // only DataRows
}