2015-11-24 1 views
0

У меня возникли проблемы с поиском промежуточного итога для столбца «цена» в элементе управления ретранслятора. Он не вычисляет промежуточный итог. Заранее спасибо!Поиск промежуточного итога для столбца в контроле репитера

Вот разметки повторителя:

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

Вот код позади:

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

Вы получаете какое-либо исключение? –

+0

Нет, я не получал никакого исключения @KaushikMaheta –

+0

Так в чем же проблема? –

ответ

2

Объявите переменную вне ItemDataBound события. Проблема с вашим кодом заключается в том, что событие ItemDataBound вызывается после того, как каждая строка привязана к элементу управления ретранслятора, поэтому каждый раз, когда ваш subtotal & price получает инициализацию до 0, вы не получаете ожидаемый результат.

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

Спасибо, что это работает! Кроме того, вы знаете, почему цена снова рассчитывается, если я добавлю другой товар в корзину. Например, продукт A (1 доллар США). Если я добавлю продукт B ($ 2), он вычисляет = 1 + 1 + 2 @Rahul Singh –

+0

Я вызываю DataBind на загрузку страницы и удаляю rptItem_ItemCommand @Rahul Signh –

+0

@RonT - Нет. Я имею в виду, когда вы добавляете новый товар в корзину? Вы снова вызываете метод DataBind? Также убедитесь, что на странице Load вы используете '! IsPostBack' и только вызываете DataBind при первоначальном запросе на получение. –

Смежные вопросы