Completed
Last Updated: 31 Jan 2024 11:39 by ADMIN
Release 2024 Q1 (2024.1.130)

What I would like is to be able to export to a named sheet and keep the other sheets in file. For example:
"Sheet 1" (with new values), "Sheet2" (with old values)

Using your current naming convention, the Option might be named FileExportMode.CreateOrOverrideSheet

Unplanned
Last Updated: 04 Oct 2023 11:10 by ADMIN
Created by: Mark
Comments: 1
Category: PivotGrid
Type: Feature Request
0

When the RowGrandTotalsPosition and ColumnGrandTotalsPosition for RadPivotGrid are set to First, it would be suitable to offers options for keeping the row/column grand totals always visible in the view after scrolling:

Unplanned
Last Updated: 24 Aug 2021 08:19 by ADMIN
Currently, all report filters remain in one line in the container.
Unplanned
Last Updated: 02 Oct 2020 07:54 by ADMIN
Created by: Chris
Comments: 1
Category: PivotGrid
Type: Feature Request
3

Hello,

I am using the pivot grid control would like to know if it is possible to add a start and end to the grouping?

My pivot grid looks like this: I would like the user to be able to specify a start and end for the grouping.

Excel has this option:

 

How can I replicate this functionality?

Unplanned
Last Updated: 30 Jul 2020 08:42 by ADMIN
Created by: paulo g
Comments: 0
Category: PivotGrid
Type: Feature Request
2

As a user I want to hide the Grand Totals for specific groups:

Unplanned
Last Updated: 06 Dec 2017 15:10 by ADMIN
Completed
Last Updated: 28 Nov 2017 06:45 by ADMIN
The new API would allow some of the default functions to be removed and custom aggregate functions to be added. At the moment the dialog can be modified like this:

Public Class MyAggregateOptionsDialog
    Inherits AggregateOptionsDialog

    Private availableAggregateFunctions As IList(Of AggregateFunction) = New List(Of AggregateFunction)() From {
        AggregateFunctions.Sum,
        AggregateFunctions.Count,
        AggregateFunctions.Average,
        AggregateFunctions.Max,
        AggregateFunctions.Min,
        AggregateFunctions.Product,
        AggregateFunctions.StdDev,
        AggregateFunctions.StdDevP,
        AggregateFunctions.Var,
        AggregateFunctions.VarP,
        New SqrtSumAggregateFunction()
    }

    Public Overrides Sub LoadSettings(aggregateDescription As PropertyAggregateDescriptionBase)
        MyBase.LoadSettings(aggregateDescription)

        Dim listAggregateFunctions = DirectCast(Me.GetType().BaseType.GetField("listAggregateFunctions", BindingFlags.NonPublic Or BindingFlags.Instance).GetValue(Me), RadListControl)
        listAggregateFunctions.DataSource = availableAggregateFunctions
    End Sub
End Class
Unplanned
Last Updated: 19 Jun 2017 11:04 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: PivotGrid
Type: Feature Request
1

			
Unplanned
Last Updated: 01 May 2017 13:00 by Sharief
Need to have the ability to resize the height of the aggregate area along with other features that will help the user see/discern the labels properly
Declined
Last Updated: 05 Apr 2017 15:07 by ADMIN
Created by: Sharief
Comments: 1
Category: PivotGrid
Type: Feature Request
0
Request is to have the ability preferably using a mouse drag to change the height of the column headers in the grid. We can already do that for data rows of the grid, but it is not possible currently to do the same for the header row.
Unplanned
Last Updated: 06 Apr 2017 15:25 by ADMIN
Completed
Last Updated: 04 Sep 2019 13:29 by ADMIN
Release R3 2019
Hour, minute, second, if possible also week
Completed
Last Updated: 09 Nov 2016 13:49 by ADMIN
Until the feature becomes available use the following workaround:

MyPivotGridChartDataProvider chartProvider = new MyPivotGridChartDataProvider(this.radPivotGrid1.PivotGridElement);
this.radPivotGrid1.ChartDataProvider = chartProvider;
this.radChartView1.DataSource = this.radPivotGrid1;
this.radChartView1.ShowLegend = true;
this.radPivotGrid1.ChartDataProvider.SeriesAxis = Telerik.Pivot.Core.PivotAxis.Rows;
this.radPivotGrid1.ChartDataProvider.GeneratedSeriesType = Telerik.WinControls.UI.GeneratedSeriesType.Line;

public class MyPivotGridChartDataProvider : PivotGridChartDataProvider
{
    public MyPivotGridChartDataProvider(RadPivotGridElement pivotGridElement)
        : base(pivotGridElement) { }

    public override void UpdateChartData()
    {
        base.UpdateChartData();

        foreach (ChartSeries series in this.ChartView.Series)
        {
            CartesianSeries cartesianSeries = series as CartesianSeries;
            if (cartesianSeries == null)
            {
                continue;
            }

            cartesianSeries.PointSize = new SizeF(7, 7);

            BindingList<PivotChartModelPoint> newData = new BindingList<PivotChartModelPoint>();
            BindingList<PivotDataPoint> points = cartesianSeries.DataSource as BindingList<PivotDataPoint>;

            foreach (PivotDataPoint point in points)
            {
                PivotChartModelPoint current = new PivotChartModelPoint() { Group = point.PivotGroup };
                if (point.Value != 0)
                {
                    current.Value = point.Value;
                }
                else
                {
                    current.Value = null;
                }

                newData.Add(current);
            }

            cartesianSeries.DataSource = null;

            cartesianSeries.CategoryMember = "Group";
            cartesianSeries.ValueMember = "Value";
            cartesianSeries.DataSource = newData;
        }
    }
}

public class PivotChartModelPoint
{
    public string Group{ get; set; }

    public double? Value { get; set; }
}

Unplanned
Last Updated: 04 Oct 2016 06:30 by ADMIN
Completed
Last Updated: 04 Oct 2016 06:36 by Alex Dybenko
Workaround:

public Form1()
{
    InitializeComponent();

    this.radPivotFieldList1.ValuesControl.CreatingVisualListItem += Aggregates_CreatingVisualListItem;
}

private void Aggregates_CreatingVisualListItem(object sender, Telerik.WinControls.UI.CreatingVisualListItemEventArgs args)
{
    args.VisualItem = new MyPivotFieldListVisualItem(this.radPivotFieldList1.ViewModel);
}

    public class MyPivotFieldListVisualItem : PivotFieldListVisualItem
    {
        private FieldListViewModel viewModel;
 
        private CommandBarDropDownButton button;
        private RadMenuItem sumMenuItem;
        private RadMenuItem avgMenuItem;
        private RadMenuItem countMenuItem;
 
        public MyPivotFieldListVisualItem(FieldListViewModel viewModel)
            : base(viewModel)
        {
            this.viewModel = viewModel;
        }
 
        protected override void CreateChildElements()
        {
            base.CreateChildElements();
 
            this.sumMenuItem = this.GetType().BaseType
                .GetField("sumMenuItem", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(this) as RadMenuItem;
 
            this.avgMenuItem = this.GetType().BaseType
              .GetField("avgMenuItem", BindingFlags.Instance | BindingFlags.NonPublic)
              .GetValue(this) as RadMenuItem;
 
            this.countMenuItem = this.GetType().BaseType
              .GetField("countMenuItem", BindingFlags.Instance | BindingFlags.NonPublic)
              .GetValue(this) as RadMenuItem;
 
            if (sumMenuItem != null && avgMenuItem != null && countMenuItem != null)
            {
                sumMenuItem.Click += OnAggregateFunctionClick;
                avgMenuItem.Click += OnAggregateFunctionClick;
                countMenuItem.Click += OnAggregateFunctionClick;
            }
 
            this.button = this.GetType().BaseType
             .GetField("button", BindingFlags.Instance | BindingFlags.NonPublic)
             .GetValue(this) as CommandBarDropDownButton;
 
            RadMenuItem aggregateOptionsMenuItem = this.GetType().BaseType
                .GetField("aggregateOptionsMenuItem", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(this) as RadMenuItem;
 
            aggregateOptionsMenuItem.Click += aggregateOptionsMenuItem_Click;
 
            RadMenuItem numberFormatMenuItem = this.GetType().BaseType
                .GetField("numberFormatMenuItem", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(this) as RadMenuItem;
 
            numberFormatMenuItem.Click += numberFormatMenuItem_Click;
        }
 
        private void numberFormatMenuItem_Click(object sender, EventArgs e)
        {
            Value value = (this.Data.DataBoundItem as Value);
            if (value == null)
            {
                return;
            }
 
            MyNumberFormatOptionsDialog dialog =  new MyNumberFormatOptionsDialog();
            dialog.ThemeName = this.GetThemeName();
 
            QueryableAggregateDescription queryableAggregateDescription = (value.Description as QueryableAggregateDescription);
            if (queryableAggregateDescription != null)
            {
                dialog.LoadQueryableSettings(queryableAggregateDescription);
            }
 
            System.Windows.Forms.DialogResult result = dialog.ShowDialog();
 
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                queryableAggregateDescription.StringFormat = dialog.SelectedStringFormat;
                this.viewModel.ExecuteUpdate();
            }
        }
 
        private void aggregateOptionsMenuItem_Click(object sender, EventArgs e)
        {
            MyAggregateOptionsDialog dialog = new MyAggregateOptionsDialog();
            dialog.ThemeName = this.GetThemeName();
 
            Value value = (this.Data.DataBoundItem as Value);
            if (value != null)
            {
                QueryablePropertyAggregateDescriptionBase queryableAggregateDescription = (value.Description as QueryablePropertyAggregateDescriptionBase);
                if (queryableAggregateDescription != null)
                {
                    dialog.LoadQueryableSettings(queryableAggregateDescription);
                }
 
                System.Windows.Forms.DialogResult result = dialog.ShowDialog();
                if (result == System.Windows.Forms.DialogResult.OK)
                {
                    queryableAggregateDescription.AggregateFunction = dialog.SelectedQueryableAggregateFunction;
                    queryableAggregateDescription.CustomName = dialog.CustomName;
 
                    this.Synchronize();
                    this.viewModel.ExecuteUpdate();
                }
            }
        }
 
        private void OnAggregateFunctionClick(object sender, EventArgs e)
        {
            Value value = (this.Data.DataBoundItem as Value);
            string function = ((RadMenuItem)sender).Text;
 
            if (value != null && this.SetNewAggregateFunction(value.Description, function))
            {
                this.Synchronize();
                this.viewModel.ExecuteUpdate();
            }
        }
 
        private bool SetNewAggregateFunction(IAggregateDescription description, string function)
        {
            QueryablePropertyAggregateDescriptionBase queryableDescription = (description as QueryablePropertyAggregateDescriptionBase);
            if (queryableDescription != null)
            {
                switch (function)
                {
                    case "Sum":
                        queryableDescription.AggregateFunction = QueryableAggregateFunction.Sum;
                        break;
                    case "Count":
                        queryableDescription.AggregateFunction = QueryableAggregateFunction.Count;
                        break;
                    case "Average":
                        queryableDescription.AggregateFunction = QueryableAggregateFunction.Average;
                        break;
                    default:
                        return false;
                }
 
                return true;
            }
 
            return false;
        }
 
        protected override void SynchronizeProperties()
        {
            base.SynchronizeProperties();
 
            Value value = (this.Data.DataBoundItem as Value);
            Label label = (this.Data.DataBoundItem as Label);
 
            if (value != null)
            {
#if !NETFX2
                QueryablePropertyAggregateDescription queryableDescription = (value.Description as QueryablePropertyAggregateDescription);
                if (queryableDescription != null)
                {
                    this.sumMenuItem.IsChecked = queryableDescription.AggregateFunction == QueryableAggregateFunction.Sum;
                    this.countMenuItem.IsChecked = queryableDescription.AggregateFunction == QueryableAggregateFunction.Count;
                    this.avgMenuItem.IsChecked = queryableDescription.AggregateFunction == QueryableAggregateFunction.Average;
                }
#endif
            }
        }
 
        private string GetThemeName()
        {
            if (this.ElementTree == null)
            {
                return string.Empty;
            }
 
            RadControl control = this.ElementTree.Control as RadControl;
 
            return control != null ? control.ThemeName : string.Empty;
        }
    }
 
public class MyAggregateOptionsDialog : AggregateOptionsDialog
    {
        private RadListControl listAggregateFunctions;
        private RadLabel labelFieldName;
        private RadTextBox textBoxCustomName;

        public MyAggregateOptionsDialog()
        {
            this.listAggregateFunctions = this.GetType().BaseType
               .GetField("listAggregateFunctions", BindingFlags.Instance | BindingFlags.NonPublic)
               .GetValue(this) as RadListControl;

            this.labelFieldName = this.GetType().BaseType
                .GetField("labelFieldName", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(this) as RadLabel;

            this.textBoxCustomName = this.GetType().BaseType
                .GetField("textBoxCustomName", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(this) as RadTextBox;
        }

        private readonly IList<QueryableAggregateFunction> availableQueryableAggregateFunctions = new List<QueryableAggregateFunction>()
            {
                QueryableAggregateFunction.Sum,
                QueryableAggregateFunction.Count,
                QueryableAggregateFunction.Average,
                QueryableAggregateFunction.Max,
                QueryableAggregateFunction.Min
            };

        public virtual QueryableAggregateFunction SelectedQueryableAggregateFunction
        {
            get
            {
                return (QueryableAggregateFunction)this.listAggregateFunctions.SelectedValue;
            }
        }

        public virtual void LoadQueryableSettings(QueryablePropertyAggregateDescriptionBase aggregateDescription)
        {
            if (this.listAggregateFunctions.DataSource != null)
            {
                this.listAggregateFunctions.DataSource = availableQueryableAggregateFunctions;
            }

            this.listAggregateFunctions.SelectedValue = aggregateDescription.AggregateFunction;
            this.labelFieldName.Text = aggregateDescription.PropertyName;
            this.Text = String.Format("{0}{1}{2}", "Aggregate Options (", aggregateDescription.PropertyName, ")");
            this.textBoxCustomName.Text = aggregateDescription.CustomName;
        }
    }

public class MyNumberFormatOptionsDialog : NumberFormatOptionsDialog
    {
        private TextBox textBox;

        public MyNumberFormatOptionsDialog()
        {
            RadDropDownList dropDownListFormat = this.GetType().BaseType
                   .GetField("dropDownListFormat", BindingFlags.Instance | BindingFlags.NonPublic)
                   .GetValue(this) as RadDropDownList;

            this.textBox = (TextBox)dropDownListFormat.DropDownListElement.EditableElement.TextBox.TextBoxItem.HostedControl;
        }

        public virtual void LoadQueryableSettings(QueryableAggregateDescriptionBase aggregateDescription)
        {
            this.textBox.Text = aggregateDescription.StringFormat;
            this.Text = String.Format(PivotGridLocalizationProvider.CurrentProvider.GetLocalizedString(PivotStringId.NumberFormatOptionsDialogFormatOptionsDescription),
                aggregateDescription.DisplayName);
            this.textBox.Select(this.textBox.Text.Length, 0);
            this.textBox.Focus();
        }
    }
Completed
Last Updated: 04 Sep 2019 13:28 by ADMIN
Release R3 2019
ADMIN
Created by: Dimitar
Comments: 3
Category: PivotGrid
Type: Feature Request
1

			
Unplanned
Last Updated: 08 Aug 2016 08:02 by ADMIN
Completed
Last Updated: 29 Aug 2016 13:40 by ADMIN
You save 2 config, one with Report filter (1), one without (2), if you load first (1), if puts report filter correctly, but if you load then (2) - report filter still as on (1).
Also, if you load config with ShowFilterArea=true - it  stays visible if you load another config with ShowFilterArea=true 

Hello Alex,

While investigating the reported behavior I managed to isolate an issue in the Save/Load API of RadPivotGrid regarding the ShowFilterArea property. The default value of this property is not serialized, however this can be altered by adding a serialization meta data to the XmlSerializationInfo instance of the pivot. In this scenario the engine did not respect the added new data. Here is the feedback item and you can subscribe to it: http://feedback.telerik.com/Project/154/Feedback/Details/196273-fix-radpivotgrid-the-saveloadlayout-string-overload-does-not-use-the-radpivotg. The item is already in development and a permanent fix will be available with our next release.

Regarding the empty filter descriptions, in order to serialize them one should work with a DataProviderSerializer class. Currently our engine does not save the empty filters and we will consider modifying it so that even if the collection is empty it also be serialized.

I am attaching to this post a sample project with which you would be able to achieve both of your tasks. Please note that the serialization API of the LocalDataSourceProvider uses the DataContract and you would need to use our .NET 4.0 assemblies.

I hope this helps. In case you need additional assistance please write here or open a support ticket.

Regards, 
Hristo
1 2 3