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

Bugs in Aggregate Functions when RadGridView is bound to a Datatable

2 Answers 54 Views
GridView
This is a migrated thread and some comments may be shown as answers.
SPE
Top achievements
Rank 1
SPE asked on 08 Feb 2012, 02:45 AM
I am using a RadGridView whose ItemsSource is bound to a DataTable.
 The reason for using DataTable is because the columns have to be generated dynamically based on user's selection.
 I've added Aggregate Functions to each columns and recalculate them when the data source changes.
 The RadGridView throws exceptions on certain conditions.
 
I've attached a sample application that reproduces the error.
 the application is contrived from the original application to include only the necessary part.
 (The original application uses MVVM pattern, and the recalculation of aggregates happens when the ItemsSource in the ViewModel changes.)
 there are 2 different errors that I've encountered so far.
 
here are the steps to reproduce the error.
 Error A
 1. set the 'number of data columns' at the top right corner to 2(default), click the 'Load' button 3 times.
 2. at the 3rd click, Telerik.Windows.Controls.GridView.GridViewFooterCell.AggregateResults_CollectionChanged throws exception.
 
Error B
 1. set 'Add Count Function to Time column' to true, 'number of data columns' to 2, then click the 'Load' button
 2. set 'number of data columns' to 1, then click the 'Load' button twice.
 3. at the 2nd click of Step 2, RadGridView.CalculateAggregates() throws exception.
 
hope you look into this error,
 and if you have a better solution on what I'm trying to achieve(dynamic column generation, calculate aggregates),
 please do suggest.
 
Thanks.

I've discovered that you can't attach solution files in this forum, so I'll put the code below.

Main.xaml
<Window x:Class="RadGridViewAggregateFunctionTest.MainView"
        Title="MainWindow" Height="350" Width="600">
    <Grid x:Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="number of data columns : " VerticalAlignment="Center"/>
            <telerik:RadNumericUpDown x:Name="radNumericUpDown" IsInteger="True" ValueChanged="radNumericUpDown_ValueChanged"
                                      Value="2"/>
            <CheckBox Content="Add Count Function at Time column" VerticalAlignment="Center" Margin="20,0,0,0" Checked="CheckBox_Checked" />
            <Button x:Name="LoadButton" Grid.Row="0" Width="100"
                    Content="Load"
                    Margin="20,0,0,0" Click="LoadButton_Click"
                    />
        </StackPanel>
        <telerik:RadGridView x:Name="radGridView" Grid.Row="1" ItemsSource="{Binding}"
                             ShowColumnFooters="True" ShowGroupPanel="False">
        </telerik:RadGridView>
    </Grid>
</Window>


Main.xaml.cs
using System;
using System.Linq;
using System.Data;
using System.Windows;
using Telerik.Windows.Controls;
using Telerik.Windows.Data;
using System.IO;
using System.Windows.Controls;
 
namespace RadGridViewAggregateFunctionTest
{
    public partial class MainView : Window
    {
        Random random = new Random();
        private const int TIME_COLUMN_INDEX = 0;
        int numberOfColumns = 0;
        bool shouldAddCountFunctionAtTimeColumn = false;
 
        public MainView()
        {
            InitializeComponent();
        }
 
        private void LoadButton_Click(object sender, RoutedEventArgs e)
        {
            radGridView.DataContext = GenerateTable();
             
            AddAggregateFunctions(radGridView);
        }
 
        private void AddAggregateFunctions(RadGridView gridView)
        {
            foreach (var column in gridView.Columns)
            {
                if (column.DisplayIndex == TIME_COLUMN_INDEX)
                {
                    if (shouldAddCountFunctionAtTimeColumn)
                    {
                        CountFunction countFunction = new CountFunction();
                        countFunction.Caption = "Count : ";
                        column.AggregateFunctions.Add(countFunction);
                    }
 
                    continue;
                }
 
                MinFunction minFunction = new MinFunction();
                minFunction.Caption = "Min : ";
                column.AggregateFunctions.Add(minFunction);
 
                MaxFunction maxFunction = new MaxFunction();
                maxFunction.Caption = "Max : ";
                column.AggregateFunctions.Add(maxFunction);
 
                AverageFunction averageFunction = new AverageFunction();
                averageFunction.Caption = "Average : ";
                column.AggregateFunctions.Add(averageFunction);
            }
 
            gridView.CalculateAggregates();
        }
 
        private DataTable GenerateTable()
        {
            DataTable table = new DataTable("My Table");
 
            GenerateColumns(table);
 
            GenerateRows(table);
 
            return table;
        }
 
        private void GenerateColumns(DataTable table)
        {
            DataColumn column = new DataColumn("Time", typeof(DateTime));
            table.Columns.Add(column);
 
            for (int i = 0; i < numberOfColumns; i++)
            {
                string columnName = Path.GetRandomFileName().Substring(0, 4);
                column = new DataColumn(columnName, typeof(float));
                table.Columns.Add(column);
            }
        }
 
        private void GenerateRows(DataTable table)
        {
            DataRow row;
 
            for (int i = 0; i < 20; i++)
            {
                row = table.NewRow();
 
                row["Time"] = DateTime.Now.AddSeconds(i);
 
                foreach (DataColumn column in table.Columns)
                {
                    if (column.ColumnName == "Time")
                    {
                        continue;
                    }
 
                    row[column.ColumnName] = (float)random.NextDouble() * 50;
                }
 
                table.Rows.Add(row);
            }
        }
 
        private void radNumericUpDown_ValueChanged(object sender, RadRangeBaseValueChangedEventArgs e)
        {
            Int32.TryParse(radNumericUpDown.Value.ToString(), out numberOfColumns);
        }
 
        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            shouldAddCountFunctionAtTimeColumn = ((CheckBox)sender).IsChecked.Value;
        }
    }
}

2 Answers, 1 is accepted

Sort by
0
Maya
Telerik team
answered on 08 Feb 2012, 07:28 AM
Hello Sunmin,

Could you try to open a support ticket and attach the sample project you mentioned there ?

All the best,
Maya
the Telerik team
Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
0
SPE
Top achievements
Rank 1
answered on 10 Feb 2012, 02:15 AM
My telerik support has expired, so I cannot submit a support ticket.
I've managed to work around the issue by creating a custom control for displaying Aggregate Functions.

Using RadGridView with DataTable as ItemsSource had a few bugs around aggregate functions.
So I think Telerik should fix them or provide another way for dynamically displaying data on RadGridView.
Tags
GridView
Asked by
SPE
Top achievements
Rank 1
Answers by
Maya
Telerik team
SPE
Top achievements
Rank 1
Share this question
or