"The specified argument is out of range"

I am adding dynamic rows to an ASP.NET GridView control using TextBoxes. But I get the error below when I click on the Add new line button.

The specified argument was out of range. Parameter Name: Index

What could be a mistake?

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 # 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"); } 
+4
source share
3 answers

It seems you are trying to get 5 items from a collection with 5 elements. Looking at your code, it seems that you start with 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"); 
+4
source

try it.

 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"); } 
0
source

I was also having the same problem as I was trying to use the value 0 in indexing without reason, i.e. starting from 1, and not from scratch

0
source

Source: https://habr.com/ru/post/1485571/


All Articles