Unplanned
Last Updated: 03 Feb 2026 13:00 by Bram
Created by: Bram
Comments: 0
Category: PivotGrid
Type: Feature Request
1
Please add the ability to click on a Pivot Grid column header and sort by the measure values. For multiple row dimensions, the sorting would first have to apply to the highest dimension and than further down the nested dimensions.
Unplanned
Last Updated: 29 Jan 2026 15:17 by Niraj

Description

The data order displayed in the PivotGrid does not follow the field order shown in the Rows configuration. Similar issue: #12989

Steps To Reproduce

  1. Run the example posted below:

  2. From the Fields list, check ContractNumber. It is added to the Columns section by default.

  3. Drag ContractNumber from Columns to the Rows section.

  4. Verify in the PivotGrid settings that the Rows area now shows:

    • Station
    • ContractNumber
      (in this order)
  5. View the data the table.

@using Telerik.Blazor.Components.PivotGrid

<TelerikButton OnClick="@OnRefresh">Refresh</TelerikButton>
<TelerikLoaderContainer Visible="@_isLoading" Text="Please wait..." />

<div class="pivot-main-container">
    <TelerikPivotGridContainer>
        <TelerikPivotGridConfiguratorButton></TelerikPivotGridConfiguratorButton>
        <TelerikPivotGridConfigurator></TelerikPivotGridConfigurator>
        <div class="pivot-grid-container">
            <TelerikPivotGrid Data="@PivotData" DataProviderType="@PivotGridDataProviderType.Local"
                              @ref="_PivotGridRef" ColumnHeadersWidth="100px" RowHeadersWidth="130px">
                <ColumnHeaderTemplate>
                    @{
                        var ctx = (PivotGridColumnHeaderTemplateContext)context;
                        int underscoreIndex = ctx.Text.IndexOf("-");
                        string text = ctx.Text;
                        if (underscoreIndex > 0)
                        {
                            text = text.Replace(text.Substring(0, underscoreIndex + 1), "");
                            <span>@text</span>
                        }
                        else
                        {
                            <span>@ctx.Text</span>
                        }
                    }
                </ColumnHeaderTemplate>

                <RowHeaderTemplate>
                    @{
                        var ctx = (PivotGridRowHeaderTemplateContext)context;
                        int underscoreIndex = ctx.Text.IndexOf("-");
                        if (underscoreIndex == 1)
                        {
                            string text = ctx.Text;
                            text = text.Replace(text.Substring(0, underscoreIndex + 1), "");
                            <span>@text</span>
                        }
                        else
                        {
                            <span>@ctx.Text</span>
                        }
                    }
                </RowHeaderTemplate>

                <DataCellTemplate Context="dataCellContext">
                    @{
                        var c = (PivotGridDataCellTemplateContext)dataCellContext;
                        string amt;

                        if (c.Value is AggregateException || c.Value?.GetType().Name == "AggregateError")
                        {
                            amt = "-";
                        }

                        else if (c.Value == null)
                        {
                            amt = (0m).ToString("C2");
                        }
                        else if (c.Value is IConvertible)
                        {
                            // Safe convert for numbers
                            amt = Convert.ToDecimal(c.Value).ToString("C2");
                        }
                        else
                        {
                            amt = c.Value?.ToString() ?? string.Empty;
                        }
                    }
                    <div style="text-align: right;">
                        @amt
                    </div>
                </DataCellTemplate>


                <PivotGridRows>
                    <PivotGridRow Name="@nameof(RptContractSalesSummaryModel.Station)" Title="Station" />
                </PivotGridRows>

                <PivotGridColumns>
                    <PivotGridColumn Name="@nameof(RptContractSalesSummaryModel.Year)" Title="Year" HeaderClass="year-header" />
                    <PivotGridColumn Name="@nameof(RptContractSalesSummaryModel.Month)" Title="Month" />
                </PivotGridColumns>

                <PivotGridMeasures>
                    <PivotGridMeasure Name="@nameof(RptContractSalesSummaryModel.Rate)" Title="Total"
                                      Aggregate="@PivotGridAggregateType.Sum" />
                </PivotGridMeasures>
            </TelerikPivotGrid>
        </div>
    </TelerikPivotGridContainer>
</div>


@code
{
    private List<RptContractSalesSummaryModel> PivotData { get; set; } = [];
    public TelerikNotification NotificationReference { get; set; } = default!;
    public TelerikPivotGrid<RptContractSalesSummaryModel> _PivotGridRef { get; set; } = default!;
    private CancellationTokenSource cancelToken = new CancellationTokenSource();
    private bool _isDisposed { get; set; } = default!;
    private bool _isLoading { get; set; } = default!;


    protected override async Task OnInitializedAsync()
    {
        await LoadReportData(cancelToken.Token);
        await base.OnInitializedAsync();
    }

    private async Task LoadReportData(CancellationToken token)
    {
        _isLoading = true;
        await Task.Delay(1000);

        var dataItemCount = 10000;
        var stationCount = 30;
        var rnd = Random.Shared;

        for (int i = 1; i <= dataItemCount; i++)
        {
            var stationNumber = rnd.Next(1, stationCount);
            if (token.IsCancellationRequested || _isDisposed) { return; }
            ;
            PivotData.Add(new RptContractSalesSummaryModel()
            {
                Station = $"Station {stationNumber}",
                ContractMonth = DateTime.Today.AddMonths(-rnd.Next(0, 13)),
                Rate = rnd.Next(123, 987) * 1.23m,
                ContractNumber = i,
                InternetOrderID = i * 10
            });
        }

        PivotData = PivotData
                        .OrderBy(x => x.Station)
                        .ThenBy(x => x.Year)
                        .ThenBy(x => x.Month).ToList();

        if (_PivotGridRef != null && !_isDisposed)
        {
            _PivotGridRef?.Rebind();
        }

        _isLoading = false;
    }

    public async Task OnRefresh()
    {
        await LoadReportData(cancelToken.Token);
        await Task.CompletedTask;
    }

    public async ValueTask DisposeAsync()
    {
        PivotData = [];
        await Task.CompletedTask;
    }

    public class RptContractSalesSummaryModel
    {
        public DateTime ContractMonth { get; set; }
        public int Year => ContractMonth.Year;
        public string Month => $"{MapMonthToLetter(ContractMonth.Month)}-{ContractMonth:MMMM}";
        public string Station { get; set; } = string.Empty;
        public string? SalesPerson { get; set; }
        public string? AdvertiserName { get; set; }
        public string? AgencyName { get; set; }
        public string? Product_Description { get; set; }
        public string? Brand { get; set; }
        public string AccountType1 { get; set; } = string.Empty;
        public string AccountType2 { get; set; } = string.Empty;
        public decimal? Rate { get; set; }
        //public int? RptUserKey { get; set; }
        public string? Demographics { get; set; }
        public string? OrderType { get; set; }
        public string? SalesOffice { get; set; }
        public int? ContractNumber { get; set; }
        public string? SectionLevel { get; set; }
        public string? AgencyGroup { get; set; }
        public string? AdvertiserGroup { get; set; }
        public string? ProductGroup { get; set; }
        public string? LineNumber { get; set; }
        public string? RevenueClassDescription { get; set; }
        public string? InternetIntegrationType { get; set; }
        public string? LineType { get; set; }
        public string? RateType { get; set; }
        public string? InternetAdType { get; set; }
        public string? InternetSubAdType { get; set; }
        public DateTime? LineStartDate { get; set; }
        public DateTime? LineEndDate { get; set; }
        public long? InternetOrderID { get; set; }
        public DateTime? InitialDelivery { get; set; }
        public string? QuantityType { get; set; }
        public long? QuantityOrdered { get; set; }
        public long? ImpressionsDelivered { get; set; }
        public long? ClicksDelivered { get; set; }
        public long? Goal { get; set; }
        public string? Limit { get; set; }
        public string? BillingType { get; set; }
        public decimal? DeliveredRevenue { get; set; }
        public string? PerformanceStatus { get; set; }
        public DateTime? LastSuccessfulJobRun { get; set; }
        public string? InternetEnvironment { get; set; }
        public string? UserField1 { get; set; }
        public string? ExternalID { get; set; }

        // to sort the months correctly in the pivot grid
        private static string MapMonthToLetter(int month)
        {
            return month switch
            {
                1 => "A",
                2 => "B",
                3 => "C",
                4 => "D",
                5 => "E",
                6 => "F",
                7 => "G",
                8 => "H",
                9 => "I",
                10 => "J",
                11 => "K",
                12 => "L",
                _ => "?"
            };
        }
    }
}

Actual Behavior

The data order displayed in the PivotGrid does not follow the field order shown in the Rows configuration.

Image

Expected Behavior

The rendered PivotGrid data should strictly follow the order of fields as defined in the Rows (or Columns) area settings.

Browser

All

Last working version of Telerik UI for Blazor (if regression)

No response

Unplanned
Last Updated: 28 Jan 2026 09:12 by ADMIN
Hello Telerik Support Team,

We are experiencing a scrolling issue in **Telerik PivotGrid for Blazor (v12)** when both vertical and horizontal scrollbars are present.

**Issue Summary**
When the PivotGrid contains enough expanded data to require both vertical and horizontal scrolling, interacting with one scrollbar causes the grid to unexpectedly reset the other scroll position (jumping back to the top or left-most column).

**Steps to Reproduce**
e.g.: https://demos.telerik.com/blazor-ui/pivotgrid/overview

1. Bind the PivotGrid with a large dataset.
2. Expand a column hierarchy (e.g., Year → Months) to generate horizontal scrolling.
3. Expand multiple row groups (some near the top and some further down) to generate vertical scrolling.
4. Scroll fully to the **right**.
5. Attempt to scroll **down** using the vertical scrollbar or mouse wheel.

   * The grid scrolls down, but the horizontal position resets to the first column.
6. Scroll to the **bottom**.
7. Attempt to scroll **right** using the horizontal scrollbar.

   * The grid scrolls right, but the vertical position resets to the top.

**Actual Behavior**
Scrolling in one direction causes the PivotGrid to reset the scroll position in the other direction.

**Expected Behavior**
Vertical and horizontal scroll positions should remain independent. Scrolling in one direction should not reset the other.

This occurs consistently when multiple row and column groups are expanded and both scrollbars are active.

Please let us know if additional configuration details or a sample project would help.

Regards,
Niraj Phalke
Unplanned
Last Updated: 26 Jan 2026 12:51 by ADMIN

Product & Version:
Telerik UI for Blazor v12
.NET 8

Description:
In the Telerik Blazor PivotGrid, when fields are added dynamically (via UI interaction), the fields are placed in the PivotGrid based on the order in which they are defined in the Fields collection, rather than the order in which the user selects or adds them.

This results in an unexpected field arrangement from a user experience perspective, as users expect the PivotGrid to reflect the sequence in which they add fields (especially when adding multiple fields one by one).

Expected Behavior:
Fields should be added to the PivotGrid in the same order as the user clicks/selects them.

Actual Behavior:
Fields are added according to their original order in the PivotGridFields configuration, ignoring the user’s selection order.

Impact:
This causes confusion for end users and limits flexibility in interactive PivotGrid scenarios where field order matters.

Request:
Please confirm if this behavior is expected. If so, is there any supported way to control or override the field insertion order based on user interaction?

<TelerikButton OnClick="@OnRefresh">Refresh</TelerikButton>
<TelerikLoaderContainer Visible="@IsLoading" Text="Please wait..." />

<TelerikPivotGridContainer>
    <TelerikPivotGridConfiguratorButton></TelerikPivotGridConfiguratorButton>
    <TelerikPivotGridConfigurator></TelerikPivotGridConfigurator>
    <TelerikPivotGrid @ref="PivotGridRef"
                      Data="@PivotData"
                      DataProviderType="@PivotGridDataProviderType.Local"
                      ColumnHeadersWidth="100px"
                      RowHeadersWidth="130px"
                      Height="70vh">
        <PivotGridRows>
            <PivotGridRow Name="@nameof(RptContractSalesSummaryModel.Station)" />
        </PivotGridRows>

        <PivotGridColumns>
            <PivotGridColumn Name="@nameof(RptContractSalesSummaryModel.Year)" />
        </PivotGridColumns>

        <PivotGridMeasures>
            <PivotGridMeasure Name="@nameof(RptContractSalesSummaryModel.Rate)" Title="Total"
                              Aggregate="@PivotGridAggregateType.Sum" />
        </PivotGridMeasures>
    </TelerikPivotGrid>
</TelerikPivotGridContainer>

@code
{
    private List<RptContractSalesSummaryModel> PivotData { get; set; } = [];
    public TelerikPivotGrid<RptContractSalesSummaryModel> PivotGridRef { get; set; } = default!;
    private CancellationTokenSource cancelToken = new CancellationTokenSource();
    private bool IsLoading { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await LoadReportData(cancelToken.Token);
        await base.OnInitializedAsync();
    }

    private async Task LoadReportData(CancellationToken token)
    {
        IsLoading = true;
        await Task.Delay(500);

        var dataItemCount = 10000;
        var stationCount = 30;
        var rnd = Random.Shared;

        for (int i = 1; i <= dataItemCount; i++)
        {
            var stationNumber = rnd.Next(1, stationCount);
            if (token.IsCancellationRequested) { return; };
            PivotData.Add(new RptContractSalesSummaryModel()
                {
                    Station = $"Station {stationNumber}",
                    ContractMonth = DateTime.Today.AddMonths(-rnd.Next(0, 13)),
                    Rate = rnd.Next(123, 987) * 1.23m,
                    Column1 = $"Column1 {rnd.Next(1, 4)}",
                    Column2 = $"Column2 {rnd.Next(1, 4)}"
                });
        }

        PivotData = PivotData
                        .OrderBy(x => x.Station)
                        .ThenBy(x => x.Year)
                        .ThenBy(x => x.Month).ToList();

        PivotGridRef?.Rebind();

        IsLoading = false;
    }

    public async Task OnRefresh()
    {
        await LoadReportData(cancelToken.Token);
        await Task.CompletedTask;
    }

    public async ValueTask DisposeAsync()
    {
        PivotData = [];
        await Task.CompletedTask;
    }

    public class RptContractSalesSummaryModel
    {
        public DateTime ContractMonth { get; set; }
        public string Station { get; set; } = string.Empty;
        public int Year => ContractMonth.Year;
        public string Month => $"{ContractMonth.Month}-{ContractMonth.ToString("MMMM")}";
        public decimal? Rate { get; set; }
        public string Column1 { get; set; } = string.Empty;
        public int ColumnRate1 { get; set; }
        public string Column2 { get; set; } = string.Empty;
        public int ColumnRate2 { get; set; }
        public string Column3 { get; set; } = string.Empty;
        public int ColumnRate3 { get; set; }
        public string Column4 { get; set; } = string.Empty;
        public int ColumnRate4 { get; set; }    
    } 
}

Unplanned
Last Updated: 23 Jan 2026 06:35 by Niraj
Created by: Niraj
Comments: 0
Category: PivotGrid
Type: Feature Request
2

Please add support for the Display(Name) DataAnnotations attribute for the autogenerated fields in the PivotGrid.

(Related to Title parameter for the rows and columns)

public class PivotModel
{
    [Display(Name = "Net Revenue")]
    public decimal Field1 { get; set; }
}

 

Unplanned
Last Updated: 20 Oct 2025 07:58 by Niraj
When configuring fields in the PivotGrid Configurator, selected fields that are not assigned to Rows, Columns, or Measures get unchecked after clicking the "Apply" button. This results in users losing their field selections.
Unplanned
Last Updated: 07 Oct 2025 08:08 by Niraj
Created by: Niraj
Comments: 0
Category: PivotGrid
Type: Bug Report
2

The PivotGrid layout and cell alignment break when filtering expanded child columns by a value that exists only in some of the columns.

Here is a test page:

  1. Expand 2024 and 2025.
  2. Filter Month by a month name, which exists only in on the of two years. At the time of writing, this is "November".
  3. Observe how the first cell in the header row has a larger colspan (2 instead of 1), so the header cells are misaligned with the data cells.
<TelerikPivotGridContainer>
    <TelerikPivotGridConfiguratorButton></TelerikPivotGridConfiguratorButton>
    <TelerikPivotGridConfigurator></TelerikPivotGridConfigurator>
        <TelerikPivotGrid Data="@PivotGridData" DataProviderType="@PivotGridDataProviderType.Local"
                          @ref="PivotGridRef" ColumnHeadersWidth="100px" RowHeadersWidth="130px">
            <ColumnHeaderTemplate>
                @{
                    var ctx = (PivotGridColumnHeaderTemplateContext)context;
                    int underscoreIndex = ctx.Text.IndexOf("-");
                    string text = ctx.Text;
                    if (underscoreIndex > 0)
                    {
                        text = text.Replace(text.Substring(0, underscoreIndex + 1), "");
                        <span>@text</span>
                    }
                    else
                    {
                        <span>@ctx.Text</span>
                    }
                }
            </ColumnHeaderTemplate>

            <DataCellTemplate Context="dataCellContext">
                @{
                    var c = (PivotGridDataCellTemplateContext)dataCellContext;
                    var amt = c.Value == null ? (0m).ToString("C2") : ((decimal)c.Value).ToString("C2");
                }
                <div style="text-align: right;">
                    @amt
                </div>
            </DataCellTemplate>

            <PivotGridRows>
                <PivotGridRow Name="@nameof(PivotGridModel.Station)" Title="Station" />
            </PivotGridRows>

            <PivotGridColumns>
                <PivotGridColumn Name="@nameof(PivotGridModel.Year)" Title="Year" HeaderClass="year-header" />
                <PivotGridColumn Name="@nameof(PivotGridModel.MonthName)" Title="Month" />
            </PivotGridColumns>

            <PivotGridMeasures>
                <PivotGridMeasure Name="@nameof(PivotGridModel.Rate)" Title="Total"
                                  Aggregate="@PivotGridAggregateType.Sum" />
            </PivotGridMeasures>
        </TelerikPivotGrid>
</TelerikPivotGridContainer>

@code
{
    private TelerikPivotGrid<PivotGridModel>? PivotGridRef { get; set; }

    private List<PivotGridModel> PivotGridData { get; set; } = new();

    protected override async Task OnInitializedAsync()
    {
        var dataItemCount = 10000;
        var stationCount = 30;
        var rnd = Random.Shared;

        for (int i = 1; i <= dataItemCount; i++)
        {
            var stationNumber = rnd.Next(1, stationCount);

            PivotGridData.Add(new PivotGridModel()
            {
                Station = $"Station {stationNumber}",
                ContractMonth = DateTime.Today.AddMonths(-rnd.Next(0, 13)),
                Rate = rnd.Next(123, 987) * 1.23m
            });
        }

        PivotGridRef?.Rebind();

        await base.OnInitializedAsync();
    }

    public class PivotGridModel
    {
        public DateTime ContractMonth { get; set; }
        public int Year => ContractMonth.Year;
        public int Month => ContractMonth.Month;
        public string MonthName => $"{Month}-{ContractMonth.ToString("MMMM")}";
        public string Station { get; set; } = string.Empty;
        public decimal? Rate { get; set; }
    }
}

 

Unplanned
Last Updated: 01 Oct 2025 07:31 by ADMIN
Created by: Niraj
Comments: 1
Category: PivotGrid
Type: Bug Report
1
When selecting a field in the PivotGrid Configurator and then clicking the Cancel button, the field remains applied to the PivotGrid (row/column). The cancel operation does not remove it right away.
Unplanned
Last Updated: 01 Oct 2025 06:08 by Niraj
Created by: Niraj
Comments: 0
Category: PivotGrid
Type: Bug Report
1
The PivotGrid row and column filtering is case sensitive. This makes the algorithm inconsistent with the other filtering features in Telerik UI for Blazor.
Unplanned
Last Updated: 30 Sep 2025 09:27 by Thomas
Created by: Thomas
Comments: 2
Category: PivotGrid
Type: Feature Request
2

It would be nice to be able to customize the comparer used to display data in a specific order.

I think by default it uses a simple alphabetic comparison

But we have a lot of data using alpha and numeric information like:

  • Label1
  • Label2
  • ...
  • Label100

And the user wants data in the numeric order, so we often implement our own comparer everywhere for it to work.

The PivotGrid doesn't seem to provide a way to customize the order of data even with a provider Local, ordering the source in a specific way before giving it to the component doesn't work either.

Thanks
Thomas

Unplanned
Last Updated: 26 Feb 2025 09:21 by Mate

The PivotGrid supports multiple Measures for the same Field on initial load. However, if the user makes a change in the configurator, then only the first Measure per Field remains visible.

===

TELERIK edit: Apart from not using a PivotGrid configurator, another possible workaround is to use custom UI instead of a configurator. Recreate the component to apply the changes:

<label class="k-checkbox-label">
    <TelerikCheckBox @bind-Value="@ShowCity"
                     OnChange="@OnPivotGridConfigurationChanged" />
    Show City Column
</label>
<label class="k-checkbox-label">
    <TelerikCheckBox @bind-Value="@ShowProduct"
                     OnChange="@OnPivotGridConfigurationChanged" />
    Show Product Row
</label>

@if (RenderPivotGrid)
{
    <TelerikPivotGrid Data="@PivotData"
                      DataProviderType="@PivotGridDataProviderType.Local"
                      ColumnHeadersWidth="240px">
        <PivotGridColumns>
            <PivotGridColumn Name="@nameof(PivotModel.Country)" Title="Country" />
            @if (ShowCity)
            {
                <PivotGridColumn Name="@nameof(PivotModel.City)" Title="City" />
            }
        </PivotGridColumns>
        <PivotGridRows>
            <PivotGridRow Name="@nameof(PivotModel.Category)" Title="Category" />
            @if (ShowProduct)
            {
                <PivotGridRow Name="@nameof(PivotModel.Product)" />
            }
        </PivotGridRows>
        <PivotGridMeasures>
            <PivotGridMeasure Name="@nameof(PivotModel.ContractValue)"
                              Title="Contract Value"
                              Aggregate="@PivotGridAggregateType.Sum" />
            <PivotGridMeasure Name="@nameof(PivotModel.ContractValue)"
                              Title="Contract Value"
                              Aggregate="@PivotGridAggregateType.Average" />
            <PivotGridMeasure Name="@nameof(PivotModel.ContractProfit)"
                              Title="Contract Value"
                              Aggregate="@PivotGridAggregateType.Sum" />
            <PivotGridMeasure Name="@nameof(PivotModel.ContractProfit)"
                              Title="Contract Value"
                              Aggregate="@PivotGridAggregateType.Average" />
        </PivotGridMeasures>
    </TelerikPivotGrid>
}

@code {
    private List<PivotModel> PivotData { get; set; } = new List<PivotModel>();

    private bool RenderPivotGrid { get; set; } = true;

    private bool ShowCity { get; set; }
    private bool ShowProduct { get; set; }

    private async Task OnPivotGridConfigurationChanged()
    {
        RenderPivotGrid = false;
        await Task.Delay(1);
        RenderPivotGrid = true;
    }

    protected override void OnInitialized()
    {
        var dataItemCount = 100;
        var categoryCount = 2;
        var productCount = 4 + 1;
        var countryCount = 2;
        var cityCount = 4 + 1;
        var rnd = Random.Shared;

        for (int i = 1; i <= dataItemCount; i++)
        {
            var productNumber = rnd.Next(1, productCount);
            var cityNumber = rnd.Next(1, cityCount);

            PivotData.Add(new PivotModel()
            {
                Category = $"Category {productNumber % categoryCount + 1}",
                Product = $"Product {productNumber}",
                Country = $"Country {cityNumber % countryCount + 1}",
                City = $"City {cityNumber}",
                ContractDate = DateTime.Now.AddDays(-rnd.Next(1, 31)).AddMonths(-rnd.Next(1, 12)).AddYears(-rnd.Next(0, 5)),
                ContractValue = rnd.Next(456, 987),
                ContractProfit = rnd.Next(43, 98)
            });
        }

        base.OnInitialized();
    }

    public class PivotModel
    {
        public string Category { get; set; } = null!;
        public string Product { get; set; } = null!;
        public string Country { get; set; } = null!;
        public string City { get; set; } = null!;
        public DateTime ContractDate { get; set; }
        public decimal ContractValue { get; set; }
        public decimal ContractProfit { get; set; }
    }
}

Unplanned
Last Updated: 21 Feb 2025 13:35 by Ho
Created by: Ho
Comments: 0
Category: PivotGrid
Type: Feature Request
5
Please add the ability to expand rows automatically on initial load.
Unplanned
Last Updated: 10 Jan 2025 10:13 by Ho

When using local data binding, all defined PivotGrid measures are checked by default and render in the Grid.

Please provide the ability to define measures, which are not checked and visible in the Grid area by default.

Unplanned
Last Updated: 09 Jan 2025 12:38 by ADMIN
Created by: Thang Cam
Comments: 0
Category: PivotGrid
Type: Feature Request
2
I want to open a modal dialog to show more detail when the user clicks on a cell in the Pivot Table. I am developing the Pivot which the user can click on the cell and will generate the Grid Table based on the category which the cell currently is.
Unplanned
Last Updated: 21 Nov 2024 13:26 by Federico

I had already tried using reflection via dataTemplate to access the ColumnGroup and RowGroup properties. It would be nice if in future versions, if possible, these were accessible directly and without having to use reflection for efficiency reasons. Expose the current field as well.

In addition to this, it would be convenient to know which row and column they refer to, in order to know which field of the Pivot dataset relates to the calculation performed, and apply custom logic to them.

In summary, expose: ColumnGroup, RowGroup, and the current field.

Unplanned
Last Updated: 30 Oct 2024 12:16 by Andreas
Created by: Andreas
Comments: 0
Category: PivotGrid
Type: Feature Request
4

Hello,

in the WPF Pivot component I created custom calculated fields. Please expose a similar feature in the Blazor PivotGrid.

https://docs.telerik.com/devtools/wpf/controls/radpivotgrid/features/queryabledataprovider/queryable-calc-fields

var OeeA = new OeeA_BerechnetesFeld(); //Telerik.Pivot.Core.CalculatedField
OeeA.Name = "OEE A";
DataSource.CalculatedFields.Add(OeeA); // DataSource is the LocalDataSourceProvider

DataSource.AggregateDescriptions.Add(new CalculatedAggregateDescription { CalculatedFieldName = "OEE A", StringFormat = "#.#0" });


Unplanned
Last Updated: 09 Aug 2024 05:34 by Tung
Created by: Tung
Comments: 0
Category: PivotGrid
Type: Feature Request
2
Currently, the PivotGrid data can only be sorted within the PivotGrid configurator.
Unplanned
Last Updated: 13 Sep 2023 10:55 by ADMIN
I want to keep the standard numeric values in the cells but I also want to show a separate column to display the cell values in percent of the column total. Similar to the PercentOfColumnTotal option in Ajax PivotGrid.
Unplanned
Last Updated: 27 Jun 2023 12:33 by Philip
Created by: Philip
Comments: 0
Category: PivotGrid
Type: Feature Request
11

I want to control the visibility of the total and sub-total. I want to be able to hide them if needed.

=====

TELERIK EDIT: It is possible to hide the Grand Total column and all Total rows with CSS. You can also hide only the non-Grand Total rows if you like.

<TelerikPivotGridContainer>

    <TelerikPivotGridConfigurator />

    <TelerikPivotGridConfiguratorButton />

    <TelerikPivotGrid Data="@PivotData"
                      DataProviderType="@PivotGridDataProviderType.Local"
                      ColumnHeadersWidth="160px"
                      Class="no-headers">
        <PivotGridColumns>
            <PivotGridColumn Name="@nameof(PivotModel.Country)" Title="Country" />
            <PivotGridColumn Name="@nameof(PivotModel.City)" Title="City" />
        </PivotGridColumns>
        <PivotGridRows>
            <PivotGridRow Name="@nameof(PivotModel.Category)" Title="Category" />
            <PivotGridRow Name="@nameof(PivotModel.Product)" Title="Product" />
        </PivotGridRows>
        <PivotGridMeasures>
            <PivotGridMeasure Name="@nameof(PivotModel.ContractValue)"
                              Title="Contract Value"
                              Aggregate="@PivotGridAggregateType.Sum" />
        </PivotGridMeasures>
    </TelerikPivotGrid>

</TelerikPivotGridContainer>

<style>
    /* Hide Grand Total column text. Remove cell paddings and borders. */
    .k-pivotgrid-column-headers .k-pivotgrid-row:first-child .k-pivotgrid-header-total:last-child,
    .k-pivotgrid-values .k-pivotgrid-header-total:last-child {
        color: transparent;
        font-size: 0;
        padding: 0;
        border-width: 0;
    }

    /* Shrink Grand Total column */
    div.k-pivotgrid.no-headers .k-pivotgrid-column-headers col:last-child,
    div.k-pivotgrid.no-headers .k-pivotgrid-values col:last-child {
        width: 0 !important;
    }

    /* Hide Total row headers text */
    /* Uncomment the not:() selector if you want to show back the Grand Total row. There must be no space before :not() */
    div.k-pivotgrid.no-headers .k-pivotgrid-row-headers tr.k-pivotgrid-row:has(.k-pivotgrid-header-total)/*:not(:last-child)*/,
    div.k-pivotgrid.no-headers .k-pivotgrid-values tr.k-pivotgrid-row:has(.k-pivotgrid-header-total:first-child)/*:not(:last-child)*/ {
        font-size: 0;
        color: transparent;
    }

        /* Remove Total headers cell paddings and borders */
        /* Uncomment the not:() selector if you want to show back the Grand Total row. There must be no space before :not() */
        div.k-pivotgrid.no-headers .k-pivotgrid-row-headers tr.k-pivotgrid-row:has(.k-pivotgrid-header-total)/*:not(:last-child)*/ th,
        div.k-pivotgrid.no-headers .k-pivotgrid-values tr.k-pivotgrid-row:has(.k-pivotgrid-header-total:first-child)/*:not(:last-child)*/ td {
            padding: 0;
            border-width: 0;
        }
</style>

@code {
    private List<PivotModel> PivotData { get; set; } = new();

    protected override void OnInitialized()
    {
        var dataItemCount = 100;
        var categoryCount = 3;
        var productCount = 10 + 1;
        var countryCount = 2;
        var cityCount = 4 + 1;
        var rnd = Random.Shared;

        for (int i = 1; i <= dataItemCount; i++)
        {
            var productNumber = Random.Shared.Next(1, productCount);
            var categoryNumber = productNumber % categoryCount + 1;
            var cityNumber = rnd.Next(1, cityCount);
            var countryNumber = cityNumber % countryCount + 1;

            PivotData.Add(new PivotModel()
            {
                Category = $"Category {categoryNumber}",
                Product = $"Product {productNumber}",
                Country = $"Country {countryNumber}",
                City = $"City {cityNumber}",
                ContractDate = DateTime.Now.AddDays(-rnd.Next(1, 31)).AddMonths(-rnd.Next(1, 12)).AddYears(-rnd.Next(0, 5)),
                ContractValue = (productNumber == 3 || cityNumber == 2 || categoryNumber == 1) ? 0 : rnd.Next(123, 987)
            });
        }

        base.OnInitialized();
    }

    public class PivotModel
    {
        public string Category { get; set; } = string.Empty;
        public string Product { get; set; } = string.Empty;
        public string Country { get; set; } = string.Empty;
        public string City { get; set; } = string.Empty;
        public DateTime ContractDate { get; set; }
        public decimal ContractValue { get; set; }
    }
}

Unplanned
Last Updated: 27 Jun 2023 12:20 by Philip
Created by: Philip
Comments: 0
Category: PivotGrid
Type: Feature Request
7
I want to be able to change the aggregate (sum/min/max etc) of measures at runtime.
1 2