Не удается найти элемент управления с помощью FindControl в RowCreated для Gridview

Я использую 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: ссылка на объект не указывает на экземпляр объекта.


person HOY    schedule 22.02.2013    source источник


Ответы (1)


RowCreated выполняется для каждого RowType(кстати, то же самое, что и с RowDataBound), поэтому для заголовка, строки данных, нижнего колонтитула или пейджера.

Первая строка — это строка заголовка, но TextBox находится в строках с RowType=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)");
    }
}

Обратите внимание, что при перечислении Rows свойства GridView вы получаете только строки с RowType=DataRow, поэтому верхний и нижний колонтитулы и пейджер опускаются. Так что здесь не нужна дополнительная проверка:

foreach(GridViewRow row in begv_OrderDetail.Rows)
{
    // only DataRows
}
person Tim Schmelter    schedule 22.02.2013