2015-02-11 3 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

+1

Лучше и быстрее будет делать это в javascript –

+0

Я согласен с тем, как делать это на стороне клиента, используя javascript, но я бы сделал это с помощью jQuery, который сделает это в нескольких операциях. – Adil

ответ

0

Если вы строго хотите сделать это на стороне сервера из-за другого вычислений или соображений безопасности, тогда вам нужно пройти через все строки, а затем найдите label и textbox элементы управления из gridview, а затем вы можете обновить значение.

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

Вот подход Гибридного клиента & на стороне сервера, который минимизирует постбэк (т.е. без Ajax)

Я предположил, что вы являетесь обязательным объектом, похожего на: (Обратите внимание, что начальное значение 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. Однако, если расчет был намного более сложным (например, налог, скидки, штрафы за проценты и т. Д.), Я бы предложил сохранить расчет целиком на стороне сервера, а затем Ajaxing параметры на onChange на сервер через UpdatePanel (или предпочтительно Json/REST API).

+0

Небольшая демонстрация на [GitHub здесь] (https://github.com/nonnb/SO28447067) – StuartLC

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(); 

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