J'ajoute des lignes dynamiques dans le contrôle ASP.Net GridView avec des zones de texte. Mais je reçois le message d'erreur ci-dessous lorsque je clique sur le bouton Ajouter une nouvelle ligne .
L'argument spécifié était en dehors de la plage de valeurs valides. Nom du paramètre: index
Quelle pourrait être l'erreur?
Th code dans mon .aspx fichier
<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>
Code C # de 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");
}
Il semble que vous essayiez de sortir 5 articles d'une collection contenant 5 articles. En regardant votre code, il semble que vous commenciez à la deuxième valeur de votre collection à la position 1. Les collections sont basées sur zéro, vous devriez donc commencer avec l'élément à l'index 0. Essayez ceci:
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");
J'avais aussi le même problème car j'ai essayé d'utiliser la valeur 0 dans l'indexation non basée, c'est-à-dire en commençant par 1 et non par zéro
essaye ça.
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");
}