10

I'm adding dynamic Rows in ASP.Net GridView Control with TextBoxes. But I'm getting the error below when I click on my Add New Row button.

Specified argument was out of the range of valid values. Parameter name: index

What could be the error ?

Th code in my .aspx file

<div id="Div1" class="divTable">
    <asp:gridview id="Gridview1" runat="server" autogeneratecolumns="false" gridlines="None"
        width="100%" height="100%">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <div class="divRow">
                            <div class="divColumn">
                                <div>
                                    <asp:Label ID="lbl1" runat="server" Text="Type Name" CssClass="formLable"></asp:Label>
                                </div>
                                <div>
                                    <asp:TextBox ID="txt_type" Width="200" runat="server" CssClass="txtbox"></asp:TextBox>
                                </div>
                                <span>
                                    <asp:RequiredFieldValidator ID="TYPE_NAME_VAL" runat="server" ControlToValidate="txt_type"
                                        ErrorMessage="Type is required." Display="Dynamic" CssClass="error"></asp:RequiredFieldValidator>
                                </span>
                            </div>
                            <div class="divColumn">
                                <div>
                                    <asp:Label ID="lbl2" runat="server" Text="Total" CssClass="formLable"></asp:Label>
                                </div>
                                <div>
                                    <asp:TextBox ID="txt_total" Width="200" runat="server" CssClass="txtbox"></asp:TextBox>
                                </div>
                            </div>
                        </div>
                        <div class="divRow">
                            <div class="divColumn">
                                <div>
                                    <asp:Label ID="lbl3" runat="server" Text="Max" CssClass="formLable"></asp:Label>
                                </div>
                                <div>
                                    <asp:TextBox ID="txt_max" Width="200" runat="server" CssClass="txtbox"></asp:TextBox>
                                </div>
                            </div>
                            <div class="divColumn">
                                <div>
                                    <asp:Label ID="lbl4" runat="server" Text="Min" CssClass="formLable"></asp:Label>
                                </div>
                                <div>
                                    <asp:TextBox ID="txt_min" Width="200" runat="server" CssClass="txtbox"></asp:TextBox>
                                </div>
                            </div>
                            <div class="divColumn">
                                <div>
                                    <asp:Label ID="lbl5" runat="server" Text="Rate" CssClass="formLable"></asp:Label>
                                </div>
                                <div>
                                    <asp:TextBox ID="txt_rate" Width="200" runat="server" CssClass="txtbox"></asp:TextBox>
                                </div>
                            </div>
                        </div>
                        <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" OnClick="ButtonAdd_Click"
                            CausesValidation="False" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:gridview>
</div>

C# code of ButtonAdd_Click()

if (ViewState["CurrentTable"] != null)
{
    DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
    DataRow drCurrentRow = null;
    if (dtCurrentTable.Rows.Count > 0)
    {
        for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
        {
            //extract the TextBox values
            TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("txt_type");
            TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("txt_total");
            TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("txt_max");
            TextBox box4 = (TextBox)Gridview1.Rows[rowIndex].Cells[4].FindControl("txt_min");
            TextBox box5 = (TextBox)Gridview1.Rows[rowIndex].Cells[5].FindControl("txt_rate");

            drCurrentRow = dtCurrentTable.NewRow();

            dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text;
            dtCurrentTable.Rows[i - 1]["Column2"] = box2.Text;
            dtCurrentTable.Rows[i - 1]["Column3"] = box3.Text;
            dtCurrentTable.Rows[i - 1]["Column4"] = box4.Text;
            dtCurrentTable.Rows[i - 1]["Column5"] = box5.Text;

            rowIndex++;
        }
        dtCurrentTable.Rows.Add(drCurrentRow);
        ViewState["CurrentTable"] = dtCurrentTable;

        Gridview1.DataSource = dtCurrentTable;
        Gridview1.DataBind();
    }
}
else
{
    Response.Write("ViewState is null");
}
John Saunders
  • 160,644
  • 26
  • 247
  • 397
Bishan
  • 15,211
  • 52
  • 164
  • 258
  • Obviously, you are using an index that is out of range. Debug to the line in which the error occurs and find out why your index isn't in range (probably to high). – Drasive Jun 11 '13 at 07:41
  • The error you're getting should specify a line number. Check that line number and see where you try to retrieve something based on index. – Terry Jun 11 '13 at 07:48
  • line is `TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("txt_type");` – Bishan Jun 11 '13 at 08:01
  • When debugging add watch for "(TextBox)Gridview1.Rows[rowIndex]" and for "(TextBox)Gridview1.Rows[rowIndex].Cells[1]" and see which one gives the error, based on that, you should see what index is the wrong one. – Terry Jun 11 '13 at 09:20
  • @Djerry Now error comes from `TextBox box5 = (TextBox)Gridview1.Rows[rowIndex].Cells[5].FindControl("txt_rate");` line. i changed `Cells[5]` to `Cells[4]` and run. then it's worked.what is the issue ? – Bishan Jun 11 '13 at 10:21
  • your cell collection is prob zero based, so try starting at 0 and end at 4 (this will get you 5 cells). – Terry Jun 11 '13 at 11:07
  • @Djerry how to find is my cell collection is zero based or not ? – Bishan Jun 11 '13 at 11:09
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/31577/discussion-between-djerry-and-bishan) – Terry Jun 11 '13 at 11:10

3 Answers3

6

It seems that you are trying to get 5 items out of a collection with 5 items. Looking at your code, it seems you're starting at the second value in your collection at position 1. Collections are zero-based, so you should start with the item at index 0. Try this:

TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[0].FindControl("txt_type");
TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("txt_total");
TextBox box3 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("txt_max");
TextBox box4 = (TextBox)Gridview1.Rows[i].Cells[3].FindControl("txt_min");
TextBox box5 = (TextBox)Gridview1.Rows[i].Cells[4].FindControl("txt_rate");
Terry
  • 5,132
  • 4
  • 33
  • 66
1

try this.

if (ViewState["CurrentTable"] != null)
            {
                DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
                DataRow drCurrentRow = null;
                if (dtCurrentTable.Rows.Count > 0)
                {
                    for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                    {
                        //extract the TextBox values
                        TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("txt_type");
                        TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("txt_total");
                        TextBox box3 = (TextBox)Gridview1.Rows[i].Cells[3].FindControl("txt_max");
                        TextBox box4 = (TextBox)Gridview1.Rows[i].Cells[4].FindControl("txt_min");
                        TextBox box5 = (TextBox)Gridview1.Rows[i].Cells[5].FindControl("txt_rate");

                        drCurrentRow = dtCurrentTable.NewRow();
                        drCurrentRow["RowNumber"] = i + 1;

                        dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text;
                        dtCurrentTable.Rows[i - 1]["Column2"] = box2.Text;
                        dtCurrentTable.Rows[i - 1]["Column3"] = box3.Text;
                        dtCurrentTable.Rows[i - 1]["Column4"] = box4.Text;
                        dtCurrentTable.Rows[i - 1]["Column5"] = box5.Text;

                        rowIndex++;
                    }
                    dtCurrentTable.Rows.Add(drCurrentRow);
                    ViewState["CurrentTable"] = dtCurrentTable;

                    Gridview1.DataSource = dtCurrentTable;
                    Gridview1.DataBind();
                }
            }
            else
            {
                Response.Write("ViewState is null");
            }
  • getting error `Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index` – Bishan Jun 11 '13 at 08:05
0

I was also getting same issue as i tried using value 0 in non-based indexing,i.e starting with 1, not with zero

Syed Mohamed
  • 1,339
  • 1
  • 15
  • 23