我正在使用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:未将对象引用设置为实例 一个对象。
答案 0 :(得分:2)
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)");
}
}
请注意,如果您枚举GridView
的{{3}}属性,则只会获得RowType
= DataRow
的行,因此会省略页眉,页脚和分页器。所以这里不需要额外的检查:
foreach(GridViewRow row in begv_OrderDetail.Rows)
{
// only DataRows
}