george mcnitt
Top achievements
Rank 1
george mcnitt
asked on 29 Sep 2010, 10:21 PM
I have the following code and I need to convert the value that comes from GridAggregateFunction.sum,
The values in the dur column are in seconds and I need to convert that to hh:mm:ss. I have a function that will do the conversion but don't see how to call it on that value (GridAggregateFunction.Sum) before it is displayed in the grid.
I tried several things in the ViewCellFormatting and CellFormatting events but that just causes my app to throw a TargetInvocationException error everytime I start it.
Any ideas would be greatly apprectiated.
Dim summary As New GridViewSummaryItem("dur", " Total: {0} ", GridAggregateFunction.Sum) Me.grdResults.MasterTemplate.SummaryRowGroupHeaders.Add(New GridViewSummaryRowItem(New GridViewSummaryItem() {summary}))The values in the dur column are in seconds and I need to convert that to hh:mm:ss. I have a function that will do the conversion but don't see how to call it on that value (GridAggregateFunction.Sum) before it is displayed in the grid.
I tried several things in the ViewCellFormatting and CellFormatting events but that just causes my app to throw a TargetInvocationException error everytime I start it.
Any ideas would be greatly apprectiated.
8 Answers, 1 is accepted
0
Emanuel Varga
Top achievements
Rank 1
answered on 30 Sep 2010, 06:46 AM
Hello George,
One example would be:
First create the summary row and the summary item:
In the format string you can add any method with a string result, for example:
It should now work as expected.
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
One example would be:
First create the summary row and the summary item:
GridViewSummaryItem summaryItem = new GridViewSummaryItem("Id", GetResultString("{0}"), GridAggregateFunction.Sum);var summaryRow = new GridViewSummaryRowItem();summaryRow.Add(summaryItem);this.radGridView1.SummaryRowsTop.Add(summaryRow);this.radGridView1.MasterView.SummaryRows[0].PinPosition = PinnedRowPosition.Top;In the format string you can add any method with a string result, for example:
private string GetResultString(string p){ var result = p; // do all the necessary calculations here return result;}It should now work as expected.
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
0
george mcnitt
Top achievements
Rank 1
answered on 30 Sep 2010, 03:59 PM
All that does is literally pass {0} to my function.
Here is the line defined as you stated.
When formatTime receives the value it is {0} and not the string like "1234".
Here is the line defined as you stated.
Dim summary2 As New GridViewSummaryItem("dur", formatTime("{0}"), GridAggregateFunction.Sum)
Here is the formatTime function.
Function formatTime(ByVal i As String) As String Dim j As Int32 = Convert.ToInt32(i) Dim strRet As String = String.Empty Dim tHr As Int32 If (j <> 0) Then If Fix(j / 3600) = 0 Then strRet = formatDigits(Fix(j / 60)) & ":" & formatDigits(j Mod 60) Else tHr = formatDigits(Fix(j / 3600)) strRet = tHr & ":" & formatDigits(Fix((j - tHr * 3600) / 60)) & ":" & formatDigits(j Mod 60) End If End If formatTime = strRet End FunctionWhen formatTime receives the value it is {0} and not the string like "1234".
0
Emanuel Varga
Top achievements
Rank 1
answered on 30 Sep 2010, 04:14 PM
Hello again,
Try it in c# and it will work, honestly i don't know the string.Format for vb.
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Try it in c# and it will work, honestly i don't know the string.Format for vb.
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
0
george mcnitt
Top achievements
Rank 1
answered on 30 Sep 2010, 05:15 PM
I am not developing in C#, The whole app is VB. This is a large project its not something I can go back and rewrite in C#.
Although I can't see why it should be any different in C#. they both have the same signature and same parameters so I should be able to do the same thing you are saying can be done using C#.
Thanks for the help.
Although I can't see why it should be any different in C#. they both have the same signature and same parameters so I should be able to do the same thing you are saying can be done using C#.
Thanks for the help.
0
Emanuel Varga
Top achievements
Rank 1
answered on 30 Sep 2010, 05:42 PM
Hello George,
I have created a vb version of the form, very simple one:
VB:
and C#:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
I have created a vb version of the form, very simple one:
VB:
Imports SystemImports System.ComponentModelImports System.Windows.FormsImports Telerik.WinControls.UIPublic Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim RadGridView1 = New RadGridView() RadGridView1.Dock = DockStyle.Fill RadGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill Me.Controls.Add(RadGridView1) RadGridView1.DataSource = New TestsCollection(10) Dim summaryItem As New GridViewSummaryItem("Id", GetResultString("{0}"), GridAggregateFunction.Sum) Dim summaryRow = New GridViewSummaryRowItem() summaryRow.Add(summaryItem) RadGridView1.SummaryRowsTop.Add(summaryRow) RadGridView1.MasterView.SummaryRows(0).PinPosition = PinnedRowPosition.Top End Sub Private Function GetResultString(ByVal p As String) As String Return "Result: " + p End FunctionEnd ClassPublic Class Test Public Property Id() As Integer Get Return m_Id End Get Set(ByVal value As Integer) m_Id = Value End Set End Property Private m_Id As Integer Public Sub New(ByVal id As Integer) Me.Id = id End SubEnd ClassPublic Class TestsCollection Inherits BindingList(Of Test) Public Sub New(ByVal noItems As Integer) For i As Integer = 1 To noItems Me.Add(New Test(i)) Next End SubEnd Classand C#:
using System;using System.ComponentModel;using System.Windows.Forms;using Telerik.WinControls.UI;namespace TestSummaryRows{ public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { var radGridView1 = new RadGridView(); radGridView1.Dock = DockStyle.Fill; radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.Controls.Add(radGridView1); radGridView1.DataSource = new TestsCollection(10); GridViewSummaryItem summaryItem = new GridViewSummaryItem("Id", GetResultString("{0}"), GridAggregateFunction.Sum); var summaryRow = new GridViewSummaryRowItem(); summaryRow.Add(summaryItem); radGridView1.SummaryRowsTop.Add(summaryRow); radGridView1.MasterView.SummaryRows[0].PinPosition = PinnedRowPosition.Top; } private string GetResultString(string p) { return "Result: " + p; } } public class Test { public int Id { get; set; } public Test(int id) { this.Id = id; } } public class TestsCollection : BindingList<Test> { public TestsCollection(int noItems) { for (int i = 1; i <= noItems; i++) { this.Add(new Test(i)); } } }}Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
0
george mcnitt
Top achievements
Rank 1
answered on 30 Sep 2010, 09:36 PM
If you actually step through your example code you will see that it is not doing anything to the actuall value of GridAggregateFuntion.Sum in your GetResultString.
All its doing is passing the literal "{0}" to the function and appending it to "Result: ".
To see exactly what I mean trying doing an actual calulation on the value "p" like p * 10
in your GetResultString function and you will see that your return value is actaully nothing more than "Result: {0}", which is the format string that GridViewSummaryItem is expecting.
you would get the exact same result as if you had just done:
Dim summaryItem As New GridViewSummaryItem("Id", "Result: {0}"), GridAggregateFunction.Sum)No actuall value is being sent, just the string literal "{0}"
That is the problem I am having, I want to actually run a function against the VALUE that is returned and not build a format string.
Here is an example. Change your GetResultString function to this.
Private Function GetResultString(ByVal p As String) As String Return "Result: " & (Convert.ToInt32(p) * 10).ToString End FunctionAnd you will see that when Convert trys to change p to an int from string "{0}" which is what it really recieved you will get an "Input string was not in a correct format." error.
0
Emanuel Varga
Top achievements
Rank 1
answered on 01 Oct 2010, 07:28 AM
Hello again,
First i want to appologize because i didn't test it thorough enough, i was assuming that the string format arguments were calculated before sending, i don't know why...
Second, from what i've been trying here, there is no way of doing that directly, i have found a workaround which you can use, but i have to warn you, it's pretty strange, but it's working.
So, first, we will have to access the evaluation mechanism directly, so you should change the summary item declaration to this:
and with this you will have a real result in the formatTime function (object this time, not string), just like:
Now, the problems are as follows:
1. You will have to have the grid data bound, or just data in the grid before creating the summary row, second, because you are always giving a calculated value to the summary row, the value should always be recalculated on CellValueChanged, just like:
Like this it is working, but i have to say, it's a pretty ugly workaround... i honestly hope they will add a ValueChanged event with a value, or at least a CustomFormatter option.
Hope this helps,
Best Regards,
Emanuel Varga
First i want to appologize because i didn't test it thorough enough, i was assuming that the string format arguments were calculated before sending, i don't know why...
Second, from what i've been trying here, there is no way of doing that directly, i have found a workaround which you can use, but i have to warn you, it's pretty strange, but it's working.
So, first, we will have to access the evaluation mechanism directly, so you should change the summary item declaration to this:
Dim summaryItem As New GridViewSummaryItem( "Id", formatTime(radGridView1.MasterTemplate.DataView.Evaluate( "Sum(Id)", 0, radGridView1.RowCount)), GridAggregateFunction.Sum)and with this you will have a real result in the formatTime function (object this time, not string), just like:
Function formatTime(ByVal i As Object) As String Dim number = Convert.ToInt32(i) * 30 + 5 ' do all the calculations here Return number.ToString()End FunctionNow, the problems are as follows:
1. You will have to have the grid data bound, or just data in the grid before creating the summary row, second, because you are always giving a calculated value to the summary row, the value should always be recalculated on CellValueChanged, just like:
Private Sub radGridView1_CellValueChanged(ByVal sender As Object, ByVal e As GridViewCellEventArgs) Handles radGridView1.CellValueChanged If e.Column.Name = "Id" Then radGridView1.MasterView.SummaryRows(0).SummaryRowItem(0).FormatString = formatTime(radGridView1.MasterTemplate.DataView.Evaluate("Sum(Id)", 0, radGridView1.RowCount)) radGridView1.Refresh() End IfEnd SubLike this it is working, but i have to say, it's a pretty ugly workaround... i honestly hope they will add a ValueChanged event with a value, or at least a CustomFormatter option.
Hope this helps,
Best Regards,
Emanuel Varga
0
Hello guys,
When each SummaryItem is evaluated, the GroupSummaryEvaluate event is fired. Its EventArgs contain the evaluated Value and the FormatString, which you can modify. Please review this help article containing examples for GroupSummaryEvaluate event usage. It works the same way for group header row and summary items.
Best regards,
Alexander
the Telerik team
When each SummaryItem is evaluated, the GroupSummaryEvaluate event is fired. Its EventArgs contain the evaluated Value and the FormatString, which you can modify. Please review this help article containing examples for GroupSummaryEvaluate event usage. It works the same way for group header row and summary items.
Best regards,
Alexander
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items