0

I have a gridview with edit and delete.

When I click Edit in the row of gridview, I get Object Reference not set to an instance of object in this line of code-behind:

Object reference not set to an instance of an object.
imgbtnEdit.Enabled = true;

Can anyone please help me with this? Thank you in advance.

My aspx for gridview is:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ImageButton imgbtnEdit = (ImageButton)e.Row.FindControl("imgbtnEdit");
        Label testing = (Label)e.Row.FindControl("testing");

        if (!string.IsNullOrEmpty(testing.Text.ToString()))
        {
            imgbtnEdit.Enabled = true;
        }
    }
}


<asp:TemplateField>
    <ItemTemplate>
        <center>
            <asp:ImageButton ID="imgbtnEdit" CommandName="Edit" runat="server" ImageUrl="/Images/icon.gif" Enabled="false" />
        </center>
    </ItemTemplate>
    <EditItemTemplate>
        <center>
            <asp:ImageButton ID="imgbtnUpdate" CommandName="Update" runat="server" ImageUrl="/Images/update.gif" />
            <asp:ImageButton ID="imgbtnCancel" runat="server" CommandName="Cancel" ImageUrl="/Images/delete.gif" />
    </EditItemTemplate>
</asp:TemplateField>
Mark
  • 3,273
  • 2
  • 36
  • 54
Hamamelis
  • 1,983
  • 8
  • 27
  • 41

1 Answers1

1
<asp:TemplateField>
                        <ItemTemplate>
                            <center>
                                <asp:ImageButton ID="imgbtnEdit" CommandName="Edit" runat="server" ImageUrl="/Images/icon.gif" Enabled="false" /></center>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <center>
                                <asp:ImageButton ID="imgbtnUpdate" CommandName="Update" runat="server" ImageUrl="/Images/update.gif" />
                                <asp:ImageButton ID="imgbtnCancel" runat="server" CommandName="Cancel" ImageUrl="/Images/delete.gif" />
                        </EditItemTemplate>
                    </asp:TemplateField>

Your image button imgbtnEdit is in the ItemTemplate. When you click to edit, GridView1_RowEditing is called and the row in GridView1 goes into 'edit mode'. When this happens only what is in the EditItemTemplate is rendered, so imgbtnEdit will not exist - which is why you are getting a null reference exception.

Edit: What I tend to do is have variable on the page called isInEditMode and set it to false when the page loads. When rowEditing is called I would write something like:

protected void GridView1_rowEditing(object sender, GridViewEditEventArgs e)
{
isInEditMode = true;
GridView1.EditIndex = e.NewEditIndex;
//rebind GridView1
}

and in rowdatabound ...

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (isInEditMode == true)
    {
    //get references to the controls in EditItemTemplates
    }
    else
    {
    //get references to the controls in ItemTemplates
    }
}

That way you won't be trying to reference controls that don't exist - depending on whether you are viewing or editing the gridview.

Martin Smellworse
  • 1,702
  • 3
  • 28
  • 46