2015-11-24 5 views
0

Je n'arrive pas à trouver le sous-total de la colonne "price" dans le contrôle du répéteur. Il ne calcule pas le sous-total. Merci d'avance!Recherche du sous-total de la colonne dans le contrôle du répéteur

Voici le balisage au répéteur:

<asp:Repeater ID="rptItem" runat="server" OnItemCommand="rptItem_ItemCommand" OnItemDataBound="rptItem_ItemDataBound"> 
     <HeaderTemplate> 
      <table id="carttable"> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <asp:Button ID="btnDelete" runat="server" Text="Delete" CommandName="delete" CommandArgument='<%# Eval("ProductId") %>' /></td> 
       <td> 
        <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("ImageUrl") %>' CssClass="imagecart" /></td> 
       <td> 
        <asp:HyperLink ID="HyperLink1" runat="server" Text='<%# Eval("ProductName") %>' NavigateUrl='<%# String.Concat("ProductDetails.aspx?ProductId=", Eval("ProductId")) %>'></asp:HyperLink></td> 
       <td> 
        <asp:Label ID="Label1" runat="server" Text='<%# String.Format("{0:C}", Eval("Price")) %>'></asp:Label></td> 
       <td> 
        <asp:TextBox ID="txtQty" runat="server" Width="50"></asp:TextBox><asp:Button ID="btnUpdate" runat="server" Text="update" /></td> 
      </tr> 
     </ItemTemplate> 
     <FooterTemplate> 
      </table> 
      Subtotal: 
      <asp:Label ID="lblSubtotal" runat="server" Text="Label"></asp:Label> 
     </FooterTemplate> 
    </asp:Repeater> 

Voici le code derrière:

protected void rptItem_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     if (e.CommandName == "delete") 
     { 
      List<Item> items = Session["Cart"] as List<Item>; 

      var productId = Convert.ToInt32(e.CommandArgument); 
      var itemToDelete = (from Item i in items 
           where i.ProductId == productId 
           select i).FirstOrDefault(); 

      items.Remove(itemToDelete); 
      Session["Cart"] = items; 
     } 

     BindData(); 
    } 

    protected void rptItem_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     double subtotal = 0; 
     double price = 0; 

     if (e.Item.ItemType == ListItemType.Item) 
     { 
      price += Convert.ToDouble(DataBinder.Eval(e.Item.DataItem, "Price")); 
      subtotal += price; 
     } 

     if (e.Item.ItemType == ListItemType.Footer) 
     { 
      Label lblSubtotal = (Label)e.Item.FindControl("lblSubtotal"); 
      lblSubtotal.Text = subtotal.ToString(); 
     } 
    } 
+0

Avez-vous des exceptions? –

+0

Non, je n'ai pas eu d'exception @KaushikMaheta –

+0

Alors, quel est votre problème? –

Répondre

2

Déclarez la variable en dehors de l'événement ItemDataBound. Le problème avec votre code est que l'événement ItemDataBound est appelé après que chaque ligne est liée au contrôle du répéteur, donc chaque fois que votre subtotal & price est initialisé à 0, vous n'obtenez pas la sortie attendue.

double subtotal = 0; 
double price = 0; 

protected void rptItem_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item) 
    { 
     price += Convert.ToDouble(DataBinder.Eval(e.Item.DataItem, "Price")); 
     subtotal += price; 
    } 

    if (e.Item.ItemType == ListItemType.Footer) 
    { 
     Label lblSubtotal = (Label)e.Item.FindControl("lblSubtotal"); 
     lblSubtotal.Text = subtotal.ToString(); 
    } 
} 
+0

Merci cette oeuvre! Aussi, savez-vous pourquoi le prix est calculé à nouveau si j'ajoute un autre article au panier. Par exemple, produit A (1 $). Si j'ajoute le produit B (2 $), il calcule = 1 + 1 + 2 @Rahul Singh –

+0

J'appelle DataBind sur la page de chargement et de supprimer rptItem_ItemCommand @Rahul Signh –

+0

@RonT - Non je veux dire lorsque vous ajoutez un nouvel élément au panier? Appelez-vous à nouveau la méthode 'DataBind'? Assurez-vous également que, lors du chargement de la page, vous utilisez '! IsPostBack' et n'appelez DataBind que lors de la demande initiale. –