Link to home
Start Free TrialLog in
Avatar of turpya
turpya

asked on

Datagrid error when paging: Index was out of range. Must be non-negative and less than the size of the collection.

I have a gridview which lists people's names retrieved from a SQL database. I am assigning the row index to the image buttons' command argument when each row is created. The image buttons work fine when on the first page of data. If I go to page 2 of the gridview and click on an image button, I receive the following error:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Source Error:


Line 366:            Case "Notes"
Line 367:                Dim index As Integer = Convert.ToInt32(e.CommandArgument)
Line 368:                Dim selectedRow As GridViewRow = GridView1.Rows(index)
Line 369:
Line 370:                lblID = selectedRow.Cells(0).FindControl("lblID")
 

Source File: e:\inetpub\people\manage_individuals.aspx.vb    Line: 368

Stack Trace:


[ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index]
   System.Collections.ArrayList.get_Item(Int32 index) +2776637
   System.Web.UI.WebControls.GridViewRowCollection.get_Item(Int32 index) +10
   _default.GridView1_RowCommand(Object sender, GridViewCommandEventArgs e) in e:\inetpub\vs137121\pastoral-care\people\manage_individuals.aspx.vb:368
   System.Web.UI.WebControls.GridView.OnRowCommand(GridViewCommandEventArgs e) +105
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +76
   System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +95
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +35
   System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +117
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +35
   System.Web.UI.WebControls.ImageButton.OnCommand(CommandEventArgs e) +115
   System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +171
   System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5102

 


--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.42


<asp:TemplateField HeaderText="">
                        <ItemTemplate>
                           <asp:Button Text="Edit" CommandName="Edit" CausesValidation="false" runat="server" ID="btEdit" CssClass="btnClass" />
                        </ItemTemplate>
                        <EditItemTemplate>
                           <asp:Button Text="Update" CommandName="Update" CausesValidation="true" runat="server" ID="btUpdate" CssClass="btnClass" />&nbsp;
                           <asp:Button Text="Cancel" CommandName="Cancel" CausesValidation="false" runat="server" ID="btCancel" CssClass="btnClass" />
                        </EditItemTemplate>
                     </asp:TemplateField>
                    <asp:TemplateField HeaderText="Actions" HeaderStyle-Font-Bold="True" HeaderStyle-HorizontalAlign="Center">
                        <ItemTemplate>
                           <asp:ImageButton ImageUrl="/images/view_person.gif" CommandArgument='<%# Container.DataItemIndex %>' Text="Click to view details on this person" CommandName="View" runat="server" ID="ibnView" />&nbsp;
                           <asp:ImageButton imageURl="/images/remove_person.gif" CommandArgument='<%# Container.DataItemIndex %>' Text="Click to remove this person from the register" CommandName="DeletePerson" runat="server" ID="ibnDelete" />&nbsp;
                           <asp:ImageButton ImageUrl="/images/notes.gif" CommandArgument='<%# Container.DataItemIndex %>' Text="Click to view notes on this person" CommandName="Notes" runat="server" ID="ibnNotes" />
                        </ItemTemplate>
                     </asp:TemplateField>
 
Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
        If e.Row.RowType = DataControlRowType.DataRow Then
 
            Dim ibn1 As ImageButton
            Dim ibn2 As ImageButton
            Dim ibn3 As ImageButton
 
            ibn1 = CType(e.Row.FindControl("ibnView"), ImageButton)
            ibn2 = CType(e.Row.FindControl("ibnDelete"), ImageButton)
            ibn3 = CType(e.Row.FindControl("ibnNotes"), ImageButton)
 
            ibn1.CommandArgument = e.Row.RowIndex
            ibn2.CommandArgument = e.Row.RowIndex
            ibn3.CommandArgument = e.Row.RowIndex
 
            ibn2.Attributes.Add("onclick", "return " & _
            "confirm('Are you sure you want to remove this person?');")
 
        End If
    End Sub

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of tony_angelopoulos
tony_angelopoulos
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of turpya
turpya

ASKER

Hi,

I am doing what the article says... "To get the index, get it from current Row's RowIndex property, for example in RowCreated event".

I am using paging (AllowPaging="True"). It works on page one of the gridview, but not on any other pages - if not on page 1 and I click a button, I get the aforementioned error.

hmmmm.... try e.row.dataitemindex  instead of row index. Paging can be a bear!
Avatar of turpya

ASKER

Thanks Tony.
I removed CommandArgument='<%# Container.DataItemIndex %>' from the template image buttons.

I realised I was assigning the CommandArgument twice: once in RowCreated event...
ibn3.CommandArgument = e.Row.RowIndex, the other on the image button in the gridview template.

Also removed gridview databinding from the PageIndexChanging event - not sure if this had any bearing on anything though.