2015-02-11 70 views
0

我想在gridview中乘以由一个Label和Textbox控件组成的gridview列,并在另一列中显示乘积值,如图所示。我想要做的是,一旦我点击按钮,所有项目都显示在gridview中,如下所示,然后它会在相应的列中自动乘以速率* 1(默认数量为1)。如何乘以gridview列并在另一列显示

我的asp.net代码

<%--ServiceID --%> 
<asp:TemplateField HeaderText="ServiceID" ItemStyle-Width="100px"> 
<ItemTemplate> 
     <asp:Label ID="lblServiceID" runat="server" Text='<%# Eval("ServiceId")%>'></asp:Label> 
</ItemTemplate> 
<ItemStyle Width="100px" /> 
</asp:TemplateField> 

<%-- Rate --%> 
<asp:TemplateField HeaderText="Rate" ItemStyle-Width="70px"> 
<ItemTemplate> 
    <asp:Label ID="lblRate" runat="server" Text='<%# Eval("Rate")%>' CssClass="rate"></asp:Label> 
</ItemTemplate>  
<ItemStyle Width="70px" /> 
</asp:TemplateField> 

<%-- Quantity --%> 
<asp:TemplateField HeaderText="Quantity"> 
<ItemTemplate> 
    <asp:TextBox ID="txtQuantity" runat="server" CssClass="txtQty"></asp:TextBox> 
</ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Total"> 
<ItemTemplate> 
    <asp:Label ID="lblTotal" runat="server"></asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 

的GridView

enter image description here

C#代码

for (int i = 0; i < GridView1.Rows.Count; i++) 
{ 
    GridView1.Rows[i].Cells[3].Text = Convert.ToString(Convert.ToDecimal(GridView1.Rows[i].Cells[1].Text) * Convert.ToDecimal(GridView1.Rows[i].Cells[2].Text)); 
} 
+1

虽然你可以做这个服务器端,例如,通过Ajax和一个UpdatePanel,因为Total是派生的,我只是简单地在客户端使用JavaScript来做到这一点? – StuartLC 2015-02-11 05:17:36

+1

最好和更快将做它在javascript – 2015-02-11 05:20:29

+0

我同意这两个关于在客户端使用javascript做,但我会用jQuery做到这一点,这将在少数语句中做到这一点。 – Adil 2015-02-11 05:29:39

回答

0

如果严格想在因为其他的服务器端做计算或安全原因,那么你必须遍历所有行然后从gridview找到labeltextbox控件,然后可以更新该值。

foreach(GridviewRow row in GridView1.Rows) 
    { 
     if(row.RowType == DataControlRowType.DataRow) 
     { 
      Label total = ((Label)Row.FindControl("lblTotal")); 
      Label rate = ((Label)Row.FindControl("lblRate")); 
      TextBox quantity = ((TextBox)Row.FindControl("txtQuantity")); 
      if(rate != null && quantity != null) 
      { 
       total.Text = (int.Parse(rate.Text) * int.Parse(quantity.Text)).ToString(); 
      } 
     } 
    } 
1

这里是一个混合型客户端&服务器端方法,最大限度地减少回发(即没有阿贾克斯)

我假设你要绑定类似的实体:(注意,Total初始值派生,服务器端)

public class Entity 
{ 
    public int ServiceId { get; set; } 
    public decimal Rate { get; set; } 
    public int Quantity { get; set; } 
    public decimal Total 
    { 
     get { return Rate * Quantity; } 
    } 
} 

.aspx,你要渲染都QuantityTotal的初始状态(例如,可能需要在同一个页面进行编辑existi ng行)。请注意,Total标签受服务器限制,但由于其值已派生,因此不需要input控制。总计不会被发回服务器。

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="false"> 
     <Columns> 
      <asp:TemplateField HeaderText="ServiceID" ItemStyle-Width="100px"> 
       <ItemTemplate> 
        <asp:Label ID="lblServiceID" runat="server" Text='<%# Eval("ServiceId")%>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Rate" ItemStyle-Width="70px"> 
       <ItemTemplate> 
        <asp:Label ID="lblRate" runat="server" Text='<%# Eval("Rate")%>' CssClass="rate"></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Quantity"> 
       <ItemTemplate> 
        <asp:TextBox ID="txtQuantity" runat="server" CssClass="txtQty" Text='<%# Eval("Quantity")%>'></asp:TextBox> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Total"> 
       <ItemTemplate> 
        <asp:Label ID="lblTotal" runat="server" CssClass='Total'><%# Eval("Total")%></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

要在同一.aspx页面中,添加以下JavaScript做Total的客户端计算,由此引发的任何数量的变化。 (并确保您有jQuery已经提及)

<script> 
    $(document).ready(function() { 
     $('.txtQty').on('change', function (evt) { 
      var $row = $(this).parents('tr'); 
      var rate = Number($row.find('.rate').text()); 
      var qty = Number($(this).val()); 
      var total = rate * qty; 
      $row.find('.Total').text(total); 
     }); 
    }); 
</script> 

在这种情况下,因为计算只是一个简单的乘法,在服务器和客户端的总计算的重复可以是合理的,因为这样可以节省浪费IO。但是,如果计算复杂得多(例如税收,折扣,利息处罚等),那么我会建议将计算完全保留在服务器端,然后通过UpdatePanel(或者最好是Json/REST API)服务。

+0

[GitHub here]上的小型演示(https://github.com/nonnb/SO28447067) – StuartLC 2015-02-12 06:20:10

0

这真的很简单:不要这样做。

提前计算所有数据,然后将GridView绑定到数据。这可能意味着您必须向底层数据源添加一列,无论是在代码后面还是在数据库中。然后计算添加的列的值,最后将您的GridView绑定到完整的数据源。

GridView控件用于显示和编辑数据,而不用于计算数据。

0
foreach(GridviewRow row in GridView1.Rows) 
    { 
     if(row.RowType == DataControlRowType.DataRow) 
     { 
      int quantity= 1; 
      TextBox txtQuantity = ((TextBox)Row.FindControl("txtQuantity")); 
      int.TryParse(txtQuantity.Text,out quantity); 
      Label lblRate = ((Label)Row.FindControl("lblRate")); 

      decimal total = decimal.Parse(lblRate.Text) * quantity; 
      Label lblTotal = ((Label)Row.FindControl("lblTotal")); 

      lblTotal.Text = total.ToString(); 

     } 
    } 
相关问题