Hello,
I am using the RadGridView version 2012.2.607.40 for WPF and am having a heck of a time trying to determine how to write a custom aggregrate function to sum a column of System.TimeSpan values. My XAML definition of my grid view looks like this:
Please note that ScanSession.Duration is of type System.TimeSpan.
I first tried the naive approach of just using the <telerik:SumFunction/> as shown above and got an InvalidOperationException with the error:
No generic method 'Sum' on type 'System.Linq.Enumerable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
So I assumed I needed to write a custom aggregrate function and looked at the standard deviation example Telerik has and came up with substituting <local:TimeSpanSumFunction SourceField="ScanSession.Duration"/> for <telerik:SumFunction/> and added the following:
I then got an InvalidOperationException with the error:
No generic method 'TimeSpanSum' on type 'Exponent.Analyzer.Performance.Aggregates' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
Finally, I wondered if I could just extend EnumerableAggregateFunction so I changed the XAML to use simply <local:TimeSpanSumFunction/> and came up with:
and I still get an InvalidOperationException with the message:
No generic method 'TimeSpanSum' on type 'Exponent.Analyzer.Performance.Aggregates' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
Obviously, I do not know how to write a custom aggregate function and I am finding what little documentation there is very unhelpful. I have more custom aggregate functions I need to write using other non-simple types.
Could somebody please give me some advise on how to write these custom aggregate functions?
And one other thing, can you also suggest how I can invoke my TimeSpanConverter (as seen in the XAML for the "Elapsed TIme" grid column") when displaying the results of the aggregte function?
Thank you,
-- john
I am using the RadGridView version 2012.2.607.40 for WPF and am having a heck of a time trying to determine how to write a custom aggregrate function to sum a column of System.TimeSpan values. My XAML definition of my grid view looks like this:
<
telerik:RadGridView
x:Name
=
"scanSessionList"
Grid.Row
=
"0"
Grid.Column
=
"0"
ItemsSource
=
"{Binding ElementName=_this, Path=ScanSessions}"
Margin
=
"0,0,0,6"
ShowGroupPanel
=
"False"
ShowGroupFooters
=
"True"
>
<
telerik:RadGridView.GroupDescriptors
>
<
telerik:GroupDescriptor
Member
=
"ScanSession.VehicleId"
SortDirection
=
"Ascending"
>
<
telerik:GroupDescriptor.AggregateFunctions
>
<
telerik:CountFunction
Caption
=
"Missions: "
/>
</
telerik:GroupDescriptor.AggregateFunctions
>
</
telerik:GroupDescriptor
>
</
telerik:RadGridView.GroupDescriptors
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
Header
=
"Description"
DataMemberBinding
=
"{Binding Path=ScanSession.Tag}"
/>
<
telerik:GridViewDataColumn
Header
=
"Start Time"
DataMemberBinding
=
"{Binding Path=ScanSession.StartTimestamp, StringFormat=d MMM yyyy HH:mm}"
/>
<
telerik:GridViewDataColumn
Header
=
"Elapsed Time"
DataMemberBinding
=
"{Binding Path=ScanSession.Duration, Converter={StaticResource TimeSpanConverter}}"
>
<
telerik:GridViewDataColumn.AggregateFunctions
>
<
telerik:SumFunction
/>
</
telerik:GridViewDataColumn.AggregateFunctions
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
Header
=
"Distance"
DataMemberBinding
=
"{Binding Path=ScanSession.DistanceTravelled, Converter={StaticResource DistanceConverter}}"
/>
<
telerik:GridViewDataColumn
Header
=
"Avg Speed"
DataMemberBinding
=
"{Binding Path=ScanSession.AverageSpeed, Converter={StaticResource SpeedConverter}}"
/>
<
telerik:GridViewDataColumn
Header
=
"Max Speed"
DataMemberBinding
=
"{Binding Path=ScanSession.MaximumSpeed, Converter={StaticResource SpeedConverter}}"
/>
</
telerik:RadGridView.Columns
>
</
telerik:RadGridView
>
Please note that ScanSession.Duration is of type System.TimeSpan.
I first tried the naive approach of just using the <telerik:SumFunction/> as shown above and got an InvalidOperationException with the error:
No generic method 'Sum' on type 'System.Linq.Enumerable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
So I assumed I needed to write a custom aggregrate function and looked at the standard deviation example Telerik has and came up with substituting <local:TimeSpanSumFunction SourceField="ScanSession.Duration"/> for <telerik:SumFunction/> and added the following:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
Telerik.Windows.Data;
namespace
Exponent.Analyzer.Performance
{
public
class
TimeSpanSumFunction : EnumerableSelectorAggregateFunction
{
protected
override
string
AggregateMethodName
{
get
{
return
"TimeSpanSum"
; }
}
protected
override
Type ExtensionMethodsType
{
get
{
return
typeof
(Aggregates); }
}
}
public
static
class
Aggregates
{
public
static
TimeSpan TimeSpanSum<TSource>(IEnumerable<TSource> source, Func<TSource, TimeSpan> selector)
{
TimeSpan sum = TimeSpan.FromSeconds(0);
foreach
(TimeSpan ts
in
source.Select(s => selector(s)))
{
sum = sum.Add(ts);
}
return
sum;
}
}
}
I then got an InvalidOperationException with the error:
No generic method 'TimeSpanSum' on type 'Exponent.Analyzer.Performance.Aggregates' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
Finally, I wondered if I could just extend EnumerableAggregateFunction so I changed the XAML to use simply <local:TimeSpanSumFunction/> and came up with:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
Telerik.Windows.Data;
namespace
Exponent.Analyzer.Performance
{
public
class
TimeSpanSumFunction : EnumerableAggregateFunction
{
protected
override
string
AggregateMethodName
{
get
{
return
"TimeSpanSum"
; }
}
protected
override
Type ExtensionMethodsType
{
get
{
return
typeof
(Aggregates); }
}
}
public
static
class
Aggregates
{
public
static
TimeSpan TimeSpanSum<TSource>(IEnumerable<TimeSpan> source)
{
TimeSpan sum = TimeSpan.FromSeconds(0);
foreach
(TimeSpan ts
in
source)
{
sum = sum.Add(ts);
}
return
sum;
}
}
}
and I still get an InvalidOperationException with the message:
No generic method 'TimeSpanSum' on type 'Exponent.Analyzer.Performance.Aggregates' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.
Obviously, I do not know how to write a custom aggregate function and I am finding what little documentation there is very unhelpful. I have more custom aggregate functions I need to write using other non-simple types.
Could somebody please give me some advise on how to write these custom aggregate functions?
And one other thing, can you also suggest how I can invoke my TimeSpanConverter (as seen in the XAML for the "Elapsed TIme" grid column") when displaying the results of the aggregte function?
Thank you,
-- john