【问题标题】:"Specified argument was out of the range of valid values"“指定的参数超出了有效值的范围”
【发布时间】:2013-06-11 07:36:42
【问题描述】:

我正在使用文本框在 ASP.Net GridView 控件中添加动态行。但是当我点击我的 Add New Row 按钮时,我收到了以下错误。

指定的参数超出了有效值的范围。参数名称:索引

可能是什么错误?

我的 .aspx 文件中的代码

<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>

ButtonAdd_Click()的C#代码

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

【问题讨论】:

  • 显然,您使用的索引超出了范围。调试到发生错误的行并找出您的索引不在范围内的原因(可能到高)。
  • 你得到的错误应该指定一个行号。检查该行号并根据索引查看您尝试在何处检索某些内容。
  • 线路是TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("txt_type");
  • 调试时添加监视“(TextBox)Gridview1.Rows[rowIndex]”和“(TextBox)Gridview1.Rows[rowIndex].Cells[1]”,看看哪一个给出了错误,基于此,您应该看到哪个索引是错误的。
  • @Djerry 现在错误来自TextBox box5 = (TextBox)Gridview1.Rows[rowIndex].Cells[5].FindControl("txt_rate"); 行。我将Cells[5] 更改为Cells[4] 并运行。然后它的工作。什么是问题?

标签: c# asp.net webforms


【解决方案1】:

您似乎正在尝试从包含 5 个项目的集合中获取 5 个项目。查看您的代码,您似乎是从集合中位置 1 的第二个值开始。集合是从零开始的,因此您应该从索引 0 处的项目开始。试试这个:

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");

【讨论】:

  • 如何使用 if tho 来防止这种情况发生?
  • 没关系,下面的答案给出了先计算结果的线索。谢谢。
【解决方案2】:

试试这个。

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

【讨论】:

  • 收到错误Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
【解决方案3】:

我也遇到了同样的问题,因为我尝试在非基础索引中使用值 0,即从 1 开始,而不是从零开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多