2

我正在使用网格视图,这是我的模板字段之一:

<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:对象引用未设置为对象的实例。

4

1 回答 1

2

RowCreated对每个RowType(顺便说一句,与 with 相同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
}
于 2013-02-22T07:46:42.093 回答