2015-11-24 20 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事件,因此每次您的初始化为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 - No我是否意味着当您将新项目添加到购物车时?你是否再次调用'DataBind'方法?还要确保页面加载使用'!IsPostBack',并且只在初始获取请求时调用DataBind。 –