删除时foreach上的ASP.net GridView InvalidOperationException

时间:2017-02-27 12:56:43

标签: c# asp.net gridview foreach invalidoperationexception

我正在使用ASP.net,我在gridview上添加了一个删除按钮,我试图删除单击按钮的行。但事实是,我的foreach上有一个InvalidOperationException。

我可能在代码中有其他错误,或者我的逻辑可能有误,所以如果您看到任何错误,请指出它们。感谢。

gridView cart.ASPX:

<asp:GridView ID="CartGrid" runat="server" AutoGenerateColumns="false" OnRowDeleting="RemoveSelected">
    <Columns>
        <asp:BoundField DataField="product_name" HeaderText="Name" />
        <asp:BoundField DataField="price_per_unit" HeaderText="Price" />
        <asp:BoundField DataField="unit" HeaderText="Unit" />

        <asp:TemplateField>
        <ItemTemplate>
        <asp:LinkButton ID="delSelected" runat="server" Text="Delete" CommandName="Delete"></asp:LinkButton>

        </ItemTemplate>
        <ItemStyle Width="100px" />

        </asp:TemplateField>
    </Columns>
</asp:GridView>

删除方法cart.ASPX.CS

protected void RemoveBtn(object sender, GridViewDeleteEventArgs e)
    {
        ArrayList cartList = (ArrayList)Session["cartList"];

        GridViewRow row = (GridViewRow)CartGrid.Rows[e.RowIndex];

        String name = row.Cells[0].Text;
        //String name = (string)CartGrid.DataKeys[e.RowIndex].Value;
        //String name = CartGrid.SelectedRow.Cells[1].Text;

        foreach (product p in cartList)
        {
            if (p.product_name.Equals(name))
            {
                cartList.Remove(p);
            }
        }

        CartGrid.DataBind();
    }

2 个答案:

答案 0 :(得分:2)

您好我认为问题在于您正在使用cartlist for循环,同时您想要删除不可能的值。

只需要改变你的方法,比如创建空列表并将所有索引添加到其中,你必须从中删除值从底部到顶部,从列表末尾开始,这样它就不会影响索引按删除的值列出,循环后你可以使用新的空列表删除它,其中包含应该删除的所有值的列表。

答案 1 :(得分:1)

您无法使用foreach修改正在迭代的集合 - 有关详细信息,请参阅this question