CalculatedColumn works fine in first inquiry. But when grid in Batch Editing mode, the Calculated Column in Client side has no mechanism to automatically calculate. I try to update total price cell by java code, but I found there is no way to find the element.
Please kindly help me to implement this.
With best regards
Jason
12 Answers, 1 is accepted

Please try the following code snippet.I was able to get the changes made to the columns be reflected on the calculated column automatically when the values are changed and saved.
ASPX:
<
telerik:RadGrid
ID
=
"RadGrid1"
runat
=
"server"
AutoGenerateColumns
=
"false"
DataSourceID
=
"SqlDataSource1"
GridLines
=
"None"
AllowPaging
=
"true"
ShowFooter
=
"true"
AllowAutomaticDeletes
=
"true"
AllowAutomaticInserts
=
"true"
AllowAutomaticUpdates
=
"true"
>
<
MasterTableView
DataKeyNames
=
"OrderID"
EditMode
=
"Batch"
CommandItemDisplay
=
"Top"
>
<
Columns
>
<
telerik:GridBoundColumn
UniqueName
=
"OrderID"
DataField
=
"OrderID"
HeaderText
=
"OrderID"
/>
<
telerik:GridBoundColumn
UniqueName
=
"ProductID"
DataField
=
"ProductID"
HeaderText
=
"ProductID"
/>
<
telerik:GridBoundColumn
DataField
=
"UnitPrice"
HeaderText
=
"UnitPrice"
UniqueName
=
"UnitPrice"
/>
<
telerik:GridBoundColumn
DataField
=
"Quantity"
HeaderText
=
"Quantity"
UniqueName
=
"Quantity"
/>
<
telerik:GridBoundColumn
DataField
=
"Discount"
HeaderText
=
"Discount"
UniqueName
=
"Discount"
/>
<
telerik:GridCalculatedColumn
HeaderText
=
"Total"
UniqueName
=
"TotalPrice"
DataType
=
"System.Double"
DataFields
=
"UnitPrice, Quantity"
Expression
=
"{0}*{1}"
FooterText
=
"Total : "
Aggregate
=
"Sum"
>
</
telerik:GridCalculatedColumn
>
</
Columns
>
</
MasterTableView
>
</
telerik:RadGrid
>
<
asp:SqlDataSource
ID
=
"SqlDataSource1"
runat
=
"server"
ConnectionString="<%$ ConnectionStrings:Northwind_newConnectionString3 %>"
DeleteCommand="DELETE FROM [Order details] WHERE [OrderID] = @OrderID" InsertCommand="INSERT INTO [Order details] ([OrderID],[UnitPrice], [Quantity],[ProductID],[Discount]) VALUES (@OrderID, @UnitPrice, @Quantity,@ProductID,@Discount)"
SelectCommand="SELECT [OrderID], [UnitPrice], [Quantity],[ProductID],[Discount] FROM [Order details] "
UpdateCommand="UPDATE [Order details] SET [UnitPrice] = @UnitPrice, [Quantity] = @Quantity,[ProductID]=@ProductID,[Discount]=@Discount WHERE [OrderID] = @OrderID">
<
DeleteParameters
>
<
asp:Parameter
Name
=
"OrderID"
Type
=
"Int32"
></
asp:Parameter
>
</
DeleteParameters
>
<
InsertParameters
>
<
asp:Parameter
Name
=
"OrderID"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"ProductID"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"UnitPrice"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"Quantity"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"Discount"
></
asp:Parameter
>
</
InsertParameters
>
<
UpdateParameters
>
<
asp:Parameter
Name
=
"OrderID"
Type
=
"Int32"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"ProductID"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"UnitPrice"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"Quantity"
></
asp:Parameter
>
<
asp:Parameter
Name
=
"Discount"
></
asp:Parameter
>
</
UpdateParameters
>
</
asp:SqlDataSource
>
Thanks,
Princy

thank you for your help. it seems by your code, the calculated column only has been updated after saved, can I get it updated in client side before saved? so the customer can review the total price before saved.
I intercept the client events OnBatchEditSetCellValue="SetCellValue"
but in SetCellValue , I couldn't find the cell of "Total Price"
function
SetCellValue(sender, args) {
if
(args.get_columnUniqueName() ===
"Quantity"
|| args.get_columnUniqueName() ===
"UnitPrice"
) {
var
row = args.get_row();
var
tableview = args.get_tableView();
alert(row.get_cell(
"TotalPrice"
).innerText);
// var cell = tableview.getCellByColumnUniqueName(row, "UnitPrice");
//alert(cell.innerHTML);
}
I'd tried many ways to get the cell, above code is failure on get total price cell. Is there any API document for these functions?
PS: I don't need update total price to db, like your code. I just want the interface friendly.
thank you very much.
With best regards
Jason
I am sorry to say but the current implementation of the batch editing functionality does not support modifying the value in the calculated column before an update in the database. However you could log this as a feature request in our feedback portal and if it gets popular enough we might consider including it in a future release.
For now this is achievable by manually calculating the value and placing it in the HTML. A sample demonstration on how to achieve this can be observed in the attached website.
Regards,
Angel Petrov
Telerik

Thank you for your help. This demo helps a lot.
Meanwhile, align attributions are missing from new row inserted in Batch Editing mode.
Do you mean that the editors in the new records are not aligned properly? The was such an issue when some of the columns were hidden by setting Display="False". However this problem is already fixed and if you download the latest internal build you should not experience such behavior.
Regards,
Angel Petrov
Telerik

My company business requires this feature too. In fact, I'm currently writing a general solution to this problem.
Was this feature requested on the feedback portal? If so, please provide me with the issue link to upvote it.
I researched our feedback portal but was unable to find a feature request for the mentioned functionality. For now you can follow the approach demonstrated in the below attached project.
Regards,
Angel Petrov
Telerik

Hi there,
Still the feature is not available in Kendo?
I am using Kendo UI for ASP.Net MVC.

I've been following the example attached by Angel and have run into three issues with the code below.
1) Decimal values in Fee are ignored. So a 4.08 fee x 1 UnitsSold = 4.00 SoldFee
2) Values greater than 999 in UnitsSold are formatted with a comma and calculations result in a NaN.
3) The calculated WeightSold column can be overriden by the user and so is editable. When the javascript populates the column the numeric textbox disappears.
<script type=
"text/javascript"
>
function
CellValueChanged(sender,args) {
var
value = args.get_value();
var
columnName = args.get_columnUniqueName();
var
feeValue;
var
weightValue;
if
(columnName ==
"UnitsSold"
) {
feeValue = parseDouble(args.get_row().cells[2].innerText);
args.get_row().cells[5].innerText = (value * feeValue).toFixed(2);
weightValue = parseDouble(args.get_row().cells[3].innerText);
args.get_row().cells[6].innerText = value * weightValue;
}
}
function
parseDouble(value) {
if
(
typeof
value ==
"string"
) {
value = value.match(/^-?\d*/)[0];
}
return
!isNaN(parseInt(value)) ? value * 1 : NaN;
}
</script>
<
telerik:RadGrid
ID
=
"grdSalesReport"
runat
=
"server"
CellSpacing
=
"-1"
DataSourceID
=
"dsGrdSalesReport"
GridLines
=
"Both"
Visible
=
"False"
AllowAutomaticUpdates
=
"True"
>
<
GroupingSettings
CollapseAllTooltip
=
"Collapse all groups"
></
GroupingSettings
>
<
MasterTableView
AutoGenerateColumns
=
"False"
DataKeyNames
=
"ProducerReportDetailID"
DataSourceID
=
"dsGrdSalesReport"
EditMode
=
"Batch"
CommandItemDisplay
=
"Bottom"
>
<
CommandItemSettings
ShowAddNewRecordButton
=
"False"
ShowRefreshButton
=
"False"
/>
<
BatchEditingSettings
EditType
=
"Cell"
/>
<
Columns
>
<
telerik:GridBoundColumn
DataField
=
"ShortDescription"
FilterControlAltText
=
"Filter ShortDescription column"
HeaderText
=
"Class"
SortExpression
=
"ShortDescription"
UniqueName
=
"ShortDescription"
ReadOnly
=
"True"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"LongDescription"
FilterControlAltText
=
"Filter LongDescription column"
HeaderText
=
"Description"
SortExpression
=
"LongDescription"
UniqueName
=
"LongDescription"
ReadOnly
=
"True"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Fee"
DataType
=
"System.Decimal"
FilterControlAltText
=
"Filter Fee column"
HeaderText
=
"Fee"
SortExpression
=
"Fee"
UniqueName
=
"Fee"
ReadOnly
=
"True"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"AvgWeight"
DataType
=
"System.Decimal"
FilterControlAltText
=
"Filter AvgWeight column"
HeaderText
=
"Average Weight"
SortExpression
=
"AvgWeight"
UniqueName
=
"AvgWeight"
ReadOnly
=
"True"
>
</
telerik:GridBoundColumn
>
<
telerik:GridTemplateColumn
DataField
=
"UnitsSold"
DataType
=
"System.Int32"
FilterControlAltText
=
"Filter UnitsSold column"
HeaderText
=
"Units Sold"
SortExpression
=
"UnitsSold"
UniqueName
=
"UnitsSold"
>
<
ItemTemplate
>
<
asp:Label
runat
=
"server"
ID
=
"lblUnitsSold"
BorderStyle
=
"Solid"
BorderWidth
=
"2px"
BorderColor
=
"#007abb"
Width
=
"100px"
CssClass
=
"RightAlign"
Text='<%# Eval("UnitsSold", "{0}") %>'></
asp:Label
>
</
ItemTemplate
>
<
EditItemTemplate
>
<
span
>
<
telerik:RadNumericTextBox
RenderMode
=
"Lightweight"
Width
=
"100px"
runat
=
"server"
ID
=
"tbUnitsSold"
CssClass
=
"RightAlign"
MinValue
=
"0"
>
</
telerik:RadNumericTextBox
>
<
span
style
=
"color: Red"
>
<
asp:RequiredFieldValidator
ID
=
"RequiredFieldValidator1"
ControlToValidate
=
"tbUnitsSold"
ErrorMessage
=
"*Required"
runat
=
"server"
Display
=
"Dynamic"
>
</
asp:RequiredFieldValidator
>
</
span
>
</
span
>
</
EditItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridBoundColumn
DataField
=
"SoldFee"
DataType
=
"System.Decimal"
FilterControlAltText
=
"Filter SoldFee column"
HeaderText
=
"Total Fee"
ReadOnly
=
"True"
SortExpression
=
"SoldFee"
UniqueName
=
"SoldFee"
>
<
ItemStyle
CssClass
=
"RightAlign"
/>
</
telerik:GridBoundColumn
>
<
telerik:GridTemplateColumn
DataField
=
"WeightSold"
DataType
=
"System.Decimal"
FilterControlAltText
=
"Filter WeightSold column"
HeaderText
=
"Total Weight"
SortExpression
=
"WeightSold"
UniqueName
=
"WeightSold"
>
<
ItemTemplate
>
<
asp:Label
runat
=
"server"
ID
=
"lblWeightSold"
BorderStyle
=
"Solid"
BorderWidth
=
"2px"
BorderColor
=
"#007abb"
Width
=
"100px"
CssClass
=
"RightAlign"
Text='<%# Eval("WeightSold", "{0}") %>'></
asp:Label
>
</
ItemTemplate
>
<
EditItemTemplate
>
<
span
>
<
telerik:RadNumericTextBox
RenderMode
=
"Lightweight"
Width
=
"100px"
runat
=
"server"
ID
=
"tbWeightSold"
CssClass
=
"RightAlign"
>
</
telerik:RadNumericTextBox
>
<
span
style
=
"color: Red"
>
<
asp:RequiredFieldValidator
ID
=
"RequiredFieldValidator2"
ControlToValidate
=
"tbWeightSold"
ErrorMessage
=
"*Required"
runat
=
"server"
Display
=
"Dynamic"
>
</
asp:RequiredFieldValidator
>
</
span
>
</
span
>
</
EditItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridBoundColumn
DataField
=
"ProducerReportDetailID"
DataType
=
"System.Int32"
FilterControlAltText
=
"Filter ProducerReportDetailID column"
HeaderText
=
"ProducerReportDetailID"
ReadOnly
=
"True"
SortExpression
=
"ProducerReportDetailID"
UniqueName
=
"ProducerReportDetailID"
Display
=
"False"
>
</
telerik:GridBoundColumn
>
</
Columns
>
</
MasterTableView
>
<
ClientSettings
AllowKeyboardNavigation
=
"true"
>
<
ClientEvents
OnBatchEditSetCellValue
=
"CellValueChanged"
/>
</
ClientSettings
>
</
telerik:RadGrid
>
You can use the approach demonstrated in the following article to achieve this requirement:
https://docs.telerik.com/devtools/aspnet-ajax/controls/grid/data-editing/edit-mode/batch-editing/how-to/update-calculated-column-client-side
Alternatively, you can also use another approach as demonstrated in the attached web site sample.
I hope this will prove helpful.
Regards,
Eyup
Progress Telerik

Hi Eyup,
Please look at my point #3 again: "The calculated WeightSold column can be overriden by the user and so
is editable. When the javascript populates the column the numeric textbox disappears."
My code follows the approach in the article you pointed out but the article does not have have the same scenario and won't encounter the same issue. That is, the calculated column is also editable and thus has an EditItemTemplate,
You can resolve this using the following approach:
Once the calculation is ready and you will set it to the numBox cell, you can use one of these instead of changing the html of the cell:
1. If you are using Cell type batch editing and the numbox cell is not currently opened, you can use the changeCellValue method by the dedicated Batch API:
https://docs.telerik.com/devtools/aspnet-ajax/controls/grid/data-editing/edit-mode/batch-editing/client-side-api
2. If you are using Row type batch editing and the numbox cell is currently opened, you can access the RadNumericTextBox Telerik object and use the numBox.set_value(calculatedValue) approach. You can find it using the findControl method:
https://www.telerik.com/support/kb/aspnet-ajax/details/access-telerik-controls-on-client-side
That should do the trick. If there are any remaining issues, you can open a formal support ticket to send us your grid configuration.
Regards,
Eyup
Progress Telerik