如何乘以gridview列并在另一列显示
我想在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
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));
}
如果严格想在因为其他的服务器端做计算或安全原因,那么你必须遍历所有行然后从gridview
找到label
和textbox
控件,然后可以更新该值。
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();
}
}
}
这里是一个混合型客户端&服务器端方法,最大限度地减少回发(即没有阿贾克斯)
我假设你要绑定类似的实体:(注意,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
,你要渲染都Quantity
和Total
的初始状态(例如,可能需要在同一个页面进行编辑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)服务。
[GitHub here]上的小型演示(https://github.com/nonnb/SO28447067) – StuartLC 2015-02-12 06:20:10
这真的很简单:不要这样做。
提前计算所有数据,然后将GridView绑定到数据。这可能意味着您必须向底层数据源添加一列,无论是在代码后面还是在数据库中。然后计算添加的列的值,最后将您的GridView绑定到完整的数据源。
GridView控件用于显示和编辑数据,而不用于计算数据。
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();
}
}
虽然你可以做这个服务器端,例如,通过Ajax和一个UpdatePanel,因为Total是派生的,我只是简单地在客户端使用JavaScript来做到这一点? – StuartLC 2015-02-11 05:17:36
最好和更快将做它在javascript – 2015-02-11 05:20:29
我同意这两个关于在客户端使用javascript做,但我会用jQuery做到这一点,这将在少数语句中做到这一点。 – Adil 2015-02-11 05:29:39