Не може да се намери контрола с помощта на FindControl на RowCreated за 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