I am on internal build 2009_3_1423.
I have a context menu within a button in my numeric column headers. This allows the user to select, Sum, Average, Min, Max etc. When they do this I add the relevant aggregate to the relevant column. Once added I call grid.CalculateAggregates() - this works fine with one column. However, when you bring two or columns into the mix things turn ugly. If I add aggregates to the secound column, they are added to the first column as well, and the values of all aggregates change to the values of the column that has just been acted on.
Any ideas on how to fix this would be great.
Thanks
Zack
Code is below
//Class
using Telerik.Windows.Data;
using Telerik.Windows.Controls;
using System.Linq;
using System;
namespace Infrastructure.Factory
{
public class AggregationFactory
{
public static void SetSubTotalForColumn(RadGridView grid, RadMenuItem item, string uniqueColumnNameAndSourceField)
{
if (!grid.ShowColumnFooters)
grid.ShowColumnFooters = true;
if (!item.IsChecked)
{
AggregationFactory.AddAggregationToGrid(
grid,
AggregationFactory.GetAggregation(Convert.ToString(item.Header), uniqueColumnNameAndSourceField),
uniqueColumnNameAndSourceField);
item.IsChecked = true;
}
else
{
AggregationFactory.RemoveAggregationFromGrid(
grid,
Convert.ToString(item.Header),
uniqueColumnNameAndSourceField);
item.IsChecked = false;
if (grid.AggregateResults.Count == 0)
grid.ShowColumnFooters = false;
}
}
private static AggregateFunction GetAggregation(string functionName, string sourceField)
{
switch (functionName)
{
case "Average":
return new AverageFunction(){ Caption = string.Concat(functionName, " : "), ResultFormatString = "{0:#,###.00}", FunctionName = functionName, SourceField = sourceField};
case "Count":
return new CountFunction() { Caption = string.Concat(functionName, " : "), ResultFormatString = "{0:#,###}", FunctionName = functionName };
case "Max":
return new MaxFunction() { Caption = string.Concat(functionName, " : "), ResultFormatString = "{0:#,###.00}", FunctionName = functionName, SourceField = sourceField };
case "Min":
return new MinFunction() { Caption = string.Concat(functionName, " : "), ResultFormatString = "{0:#,###.00}", FunctionName = functionName, SourceField = sourceField };
case "Sum":
return new SumFunction() { Caption = string.Concat(functionName, " : "), ResultFormatString = "{0:#,###.00}", FunctionName = functionName, SourceField = sourceField };
default:
return null;
}
}
private static void AddAggregationToGrid(RadGridView grid, AggregateFunction function, string uniqueColumn)
{
((GridViewDataColumn)grid.Columns[uniqueColumn]).AggregateFunctions.Add(function);
grid.CalculateAggregates();
}
private static void RemoveAggregationFromGrid(RadGridView grid, string functionName, string uniqueColumn)
{
((GridViewDataColumn)grid.Columns[uniqueColumn]).AggregateFunctions.Remove(
((GridViewDataColumn)grid.Columns[uniqueColumn]).AggregateFunctions.First(func => func.FunctionName == functionName)
);
grid.CalculateAggregates();
}
}
}
//Event Handler in code behind
private void RadContextMenu_ItemClick(object sender, RadRoutedEventArgs e)
{
RadContextMenu menu = (RadContextMenu)sender;
RadMenuItem item = (RadMenuItem)e.OriginalSource;
AggregationFactory.SetSubTotalForColumn(this.GridDataClients, item, Convert.ToString(menu.Tag));
}
//XAML for context menu within header
<telerikGridView:GridViewDataColumn DataMemberBinding="{Binding Path=NumericColumn}" IsVisible="True" DataFormatString="{}{0:#,###.00}" TextAlignment="Right" UniqueName="NumericColumn">
<telerikGridView:GridViewDataColumn.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0" Margin="0,5">
<TextBlock Text="Alloc Total Cash" VerticalAlignment="Center" />
</StackPanel>
<Button Grid.Column="1">
<Button.Template>
<ControlTemplate>
<Image Source="Resources/SomeImage.png" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Right" />
</ControlTemplate>
</Button.Template>
<Navigation:RadContextMenu.ContextMenu>
<Navigation:RadContextMenu telerik:StyleManager.Theme="Windows7" EventName="Click" ItemClick="RadContextMenu_ItemClick" Tag="NumericColumn">
<Navigation:RadContextMenu.Items>
<Navigation:RadMenuItem Header="Average" />
<Navigation:RadMenuItem Header="Count" />
<Navigation:RadMenuItem Header="Max" />
<Navigation:RadMenuItem Header="Min" />
<Navigation:RadMenuItem Header="Sum"/>
</Navigation:RadContextMenu.Items>
</Navigation:RadContextMenu>
</Navigation:RadContextMenu.ContextMenu>
</Button>
</Grid>
</telerikGridView:GridViewDataColumn.Header>
</telerikGridView:GridViewDataColumn>