This is a migrated thread and some comments may be shown as answers.

[Solved] Calculate sum of textbox values within GridTemplateColumn?

2 Answers 447 Views
Grid
This is a migrated thread and some comments may be shown as answers.
saggiatorius
Top achievements
Rank 1
saggiatorius asked on 02 Nov 2009, 03:45 PM
Hi, I need to calculate and display in the footer the total (sum) of values inserted in textboxes within a GridTemplateColumn.
I've seen that it's very easy if you have GridBoundColumn, just using Aggregate="Sum".
But how can I do this for Textbox columns?

Here is column definition code.

Thanks

<telerik:GridTemplateColumn UniqueName="InvoiceAmount" SortExpression="InvoiceAmount">   
  <ItemTemplate> 
    <asp:Label runat="server" ID="lblInvoiceAmount" Text='<%# Eval("InvoiceAmount", "{0:#.##}") %>'></asp:Label> 
  </ItemTemplate> 
  <EditItemTemplate> 
    <asp:TextBox runat="server" ID="txtInvoiceAmount" Text='<%# Bind("InvoiceAmount") %>' Width="88%" CssClass="RadTextBox"></asp:TextBox>   
    <asp:RequiredFieldValidator ID="revInvoiceAmount" runat="Server" ControlToValidate="txtInvoiceAmount" Text="*" Display="Dynamic" ErrorMessage="Attention: Invoice Amount is required!"></asp:RequiredFieldValidator> 
    <asp:CompareValidator ID="cvInvoiceAmount" runat="server" ControlToValidate="txtInvoiceAmount" Operator="DataTypeCheck" Type="Double" Text="*" Display="Dynamic"></asp:CompareValidator>    
  </EditItemTemplate>   
  <HeaderTemplate> 
    <table width="100%">  
      <tr style="width:100%">  
        <td>Invoice</td> 
      </tr> 
    </table>          
  </HeaderTemplate> 
  <HeaderStyle Width="140px" VerticalAlign="Middle" /> 
</telerik:GridTemplateColumn>     

2 Answers, 1 is accepted

Sort by
0
Princy
Top achievements
Rank 2
answered on 03 Nov 2009, 07:17 AM
Hello Saggiatorius,

Here are some help links which you can refer, to calculate the totals for a template column and display it in the footer. Probably these should help you achieve the required:
Help document: Totals in grid footers
online demo:RadNumericTextBox for Footer Totals

Thanks
Princy.
0
saggiatorius
Top achievements
Rank 1
answered on 04 Nov 2009, 10:41 AM
Thanks. Demo was useful but imperfect.
Here is how I implemented the solution basing on the online demo:RadNumericTextBox for Footer Totals.

I use a function: CalculateTotal() that I can call within RadGrid2_ItemDataBound or wherever.
In the case you have other textbox columns, or strange elements in other columns, the sum on the footer may be wrong because items' values might be calculated after RadGrid2_ItemDataBound. This is the reason you need to call CalculateTotal() also outside RadGrid2_ItemDataBound.

Protected Sub RadGrid2_ItemDataBound(ByVal sender As Object, ByVal e As GridItemEventArgs)  
        If TypeOf e.Item Is GridFooterItem Then  
            If Me.RadGrid2.Items.Count > 0 Then  
                CalculateTotal()  
            End If  
        End If  
    End Sub 

Private Sub CalculateTotal()  
        Dim amount As Double = 0 
        Dim sum As Double = 0 
 
        For Each item As GridDataItem In Me.RadGrid2.Items  
            Try  
                amount CType(item.Item("Amount").Controls(1), RadNumericTextBox).Value  
            Catch  
                amount 0 
            Finally  
                sum += amount
            End Try  
        Next  
 
        Dim footer As GridFooterItem = Me.RadGrid2.MasterTableView.GetItems(GridItemType.Footer)(0)  
        Dim numericTextBox As RadNumericTextBox = CType(footer("Amount").FindControl("TB_Sum_Amount"), RadNumericTextBox)  
        numericTextBox.Visible = True 
        numericTextBox.Value = sum.ToString()  
          
    End Sub 

Moreover it's better if you check the value of the sender before summing it within the javascript code, otherwhise if you sum an empty string to a value it becames 10 times greater (12,3 + "" = 123)

<telerik:RadScriptBlock runat="server" ID="RadScriptBlock1">  
           <script type="text/javascript">  
                   
                   var sumInput = null;  
                   var tempValue = 0.0;  
       
                   function Load(sender, args)  
                   {  
                       sumInput = sender;  
                   }  
                     
                   function Blur(sender, args)  
                   {  
                       if (sender.get_value() != "")  
                            sumInput.set_value(tempValue + sender.get_value());  
                       else  
                            sumInput.set_value(tempValue)  
                   }  
                     
                   function Focus(sender, args)  
                   {  
                       if (sender.get_value() != "")  
                           tempValue = sumInput.get_value() - sender.get_value();  
                       else  
                           tempValue = sumInput.get_value()  
                   }  
                     
           </script> 
</telerik:RadScriptBlock> 
Tags
Grid
Asked by
saggiatorius
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 2
saggiatorius
Top achievements
Rank 1
Share this question
or