2017-02-27 3 views
0

Ich benutze ASP.net und ich habe eine Schaltfläche zum Löschen in einer Gridview hinzugefügt und ich versuche, die Zeile der Schaltfläche geklickt entfernen. Die Sache ist, dass ich eine InvalidOperationException auf meinem Foreach bekomme.ASP.net GridView InvalidOperationException auf foreach beim Löschen

Ich habe möglicherweise andere Fehler im Code oder meine Logik kann falsch sein, also, wenn Sie etwas davon sehen, weisen Sie sie bitte darauf hin. Vielen Dank.

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> 

Löschmethode 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(); 
    } 
+0

Sie können keine Iterationsvariable oder vielmehr die Sammlung ändern, auf der Sie iterieren. – C4u

+0

Mögliches Duplikat von [Element in 'foreach' effizient löschen] (http://stackoverflow.com/questions/8791557/efficiently-deleting-item-from-within-foreach) – klashar

+0

Mögliche Duplikate von [Warum kann ich nicht ändern? die Variable der Schleife in einer foreach?] (http://stackoverflow.com/questions/3551696/why-cant-i-modify-the-loop-variable-in-a-foreach) – C4u

Antwort

1

Sie können die Sammlung nicht ändern Sie iterieren mit der foreach - bitte this question siehe Mehr Informationen.

2

Hallo Ich denke, das Problem ist, dass Sie die Cartlist für Schleife verwenden und gleichzeitig Werte aus dem gleichen löschen möchten, die nicht möglich ist.

Sie müssen nur Ihren Ansatz ändern, wie die leere Liste erstellen und den gesamten Index hinzufügen, von wo Sie den Wert von unten nach oben wie vom Ende der Liste zu löschen, so dass es den Index nicht beeinflussen kann Die Liste nach gelöschtem Wert und after-Schleife können Sie löschen, indem Sie die neue leere Liste verwenden, die die Liste aller Werte enthält, die gelöscht werden sollen.

+0

Vielen Dank! Das hat mein Problem gelöst, mein Held ohne Umhang! Ich akzeptiere die Antwort in 1 Minute. Ihr Kommentar ließ mich die Situation viel besser verstehen. Ich habe ein temporäres Produkt erstellt, das den Wert des p-Produkts erhält, wenn stattdessen die if-Anweisung in der foreach erfüllt ist. –

+0

Danke @albinaberg –

Verwandte Themen