Search code examples
c#asp.netbuttonrepeateritemcommand

Firing different linkbuttons in a Repeater and saving the value of each in an arraylist


Im using a repeater to display some products in an online shop for a school project. This is how the front end looks with the repeater

<asp:Repeater ID="Repeater1" runat="server"  OnItemCommand="rptList_ItemCommand">
    <ItemTemplate>
     <span style="float:left; padding:25px;" class="backgrnd">
      <asp:ImageButton ID="imgProd" runat="server" style="width:150px; height:150px;"    ImageUrl='<%# DataBinder.Eval(Container.DataItem, "productImg")%>' CommandArgument='<%# DataBinder.Eval(Container.DataItem, "productID")%>' CommandName="ViewIndividProd"/><br />
      <p style="clear:left;">
      <asp:Label ID="lbName" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "productName")%>' /><br />
      <asp:Label ID="lbUnitPrice" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "unitPrice")%>'/><br />
      <asp:Label ID="lbRatings" runat="server" Text=''>Ratings</asp:Label><br />
      <asp:LinkButton ID="linkCart" runat="server" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "productID")%>' CommandName="AddToCart">Add to Cart</asp:LinkButton>
      </p>
    </span>
    </ItemTemplate>
</asp:Repeater>

As you can see I've added on the OnItemCommand in the Repeater tag so that this is invoked whenever one of the buttons(image/link) is fired. That works perfectly fine for both commandname AddToCart and ViewIndividProd. However, i want to store the the productid of a specific item that was invoked by the particular button. In my case now, it only stores ONE productid in the arraylist at a time and 'forgets' the productid that was stored previously when another linkbutton is clicked.

Question How do i make it such that everytime a linkbutton in the repeater is fired, it remembers the productid pertaining to the linkbutton that was fired and save these ids into the arraylist? This is how the back end looks

ArrayList cart = new ArrayList();
protected void rptList_ItemCommand(object sender, RepeaterCommandEventArgs e) {
    if (e.CommandName == "ViewIndividProd") {
        Session["productID"] = e.CommandArgument.ToString();
        Response.Redirect("IndividProduct.aspx");
    }
    if (e.CommandName == "AddToCart") {

        string prodid = e.CommandArgument.ToString();
        cart.Add(prodid);
        Session["ShoppingCart"] = cart;
        Response.Redirect("IndividCat.aspx");
    }
    msg.Text = "Shopping cart: " + String.Join(",", cart.ToArray());
}

Your feedback would be much appreciated.


Solution

  • You need to understand the Asp.net Page life cycle.

    A new instance of your Page object is created on every request. Values from your input are populated into it.

    Your array list is getting recreated every time. If you want the values to persist, you will have to store your arraylist in the ViewState or the Session

    Refer: How to: Save Values in View State

      void Page_Load(object sender, EventArgs e)
      {
        if (ViewState["arrayListInViewState"] != null)
        {
          PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
        }
        else
        {
          // ArrayList isn't in view state, so we need to create it from scratch.
          PageArrayList = CreateArray();
        }
        // Code that uses PageArrayList.
      }