Skip Navigation LinksHome / Community & Support / Developer Productivity Tools Forums / WPF > GridView > Bugs in Aggregate Functions when RadGridView is bound to a Datatable

Not answered Bugs in Aggregate Functions when RadGridView is bound to a Datatable

Feed from this thread
  • sunmin avatar

    Posted on Feb 7, 2012 (permalink)

    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;
            }
        }
    }

    Reply

  • Maya Maya admin's avatar

    Posted on Feb 8, 2012 (permalink)

    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 >>

    Reply

  • sunmin avatar

    Posted on Feb 9, 2012 (permalink)

    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.

    Reply

Back to Top

Skip Navigation LinksHome / Community & Support / Developer Productivity Tools Forums / WPF > GridView > Bugs in Aggregate Functions when RadGridView is bound to a Datatable
Related resources for "Bugs in Aggregate Functions when RadGridView is bound to a Datatable"

WPF Grid Features  |  Documentation  |  Demos  |  Telerik TV  |  Self-Paced Trainer  ]