2

私はグリッドビューを使用しています。これが私のテンプレートフィールドの 1 つです。

<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(ところで、と同じRowDataBound)に対して実行されるため、ヘッダー、データ行、フッター、またはページャーに対して実行されます。

最初の行はヘッダー行ですが、=のTextBox行にあります。にあるので、次も確認する必要があります。RowTypeDataRowEditItemTemplateEditIndex

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行のみが取得されるため、ヘッダー、フッター、およびページャーが省略されることに注意してください。したがって、ここでは追加のチェックは必要ありません。RowTypeDataRow

foreach(GridViewRow row in begv_OrderDetail.Rows)
{
    // only DataRows
}
于 2013-02-22T07:46:42.093 に答える