Declined
Last Updated: 26 Mar 2026 11:31 by ADMIN
Created by: Ron
Comments: 5
Category: Grid
Type: Feature Request
0

Hi,

The ask is for a feature request to take the already wonderfully done globally applied filter features down to a per column basis without the overhead and burden of resorting to the custom FilterMenuTemplate approach.

The current way of doing business creates much overhead in code particularly when several columns are involved.

Something like:

<TelerikGrid Data="@MyData"
FilterMode="@GridFilterMode.PerColumn"

<GridColumns>
<GridColumn Field="MyField01" FilterMode="@GridFilterColumnMode.FilterRow" />

<GridColumn Field="MyField02" FilterMode="@GridFilterColumnMode.FilterMenu" />

<GridColumn Field="MyField03" Filterable="false"/>

etc..

</GridColumns>

</TelerikGrid>

 

Thanks!

Ron

Unplanned
Last Updated: 14 Apr 2026 11:33 by ADMIN
Scheduled for 2026 Q2

Bug report

Reproduction of the problem

Possibly related to https://github.com/telerik/blazor/issues/2594

  1. Run this example: https://blazorrepl.telerik.com/wAkdbZPo47oCuV5G32
  2. Without scrolling the Grid horizontally resize a non-locked column (e.g., In Stock)

Current behavior

(optional)

The first locked column (ID) is rendered after the second locked column (Product Name). When you resize a non-locked column, the ID column disappears and is revealed at its new position after you scroll the Grid horizontally.
The behavior is reproducible with RTL enabled.

Expected/desired behavior

The order of the locked columns should persist.

Environment

  • Telerik version: 13.0.0
  • Browser: [all]
Unplanned
Last Updated: 19 Mar 2026 14:46 by Clifton
Specifically, if the div mentioned in the error does not have tabindex=1, tabbing from the header causes the browser to focus that area, which is not the expected behavior. Ideally, the focus should move to the first cell, as that intermediate area is not user-interactive.

On the other hand, if tabindex=-1 is used, tools like Аxe and Lighthouse report errors. Removing the tabindex attribute altogether still results in errors, and the browser continues to focus that area.

We are actively exploring possible approaches to address this, but at the moment, there is no immediate solution we can apply without side effects.
Unplanned
Last Updated: 16 Mar 2026 07:31 by Michal
Created by: Michal
Comments: 0
Category: Grid
Type: Feature Request
1
Please expose an Enabled parameter for all built-in GridToolBar tools. When set, the parameter will override the default behavior for the built-in tools that manage their enabled state internally (such as Edit, which enables only when there is a selected row).
Unplanned
Last Updated: 16 Mar 2026 07:28 by Michal
Please expose built-in Grid ToolBar tools like GridToolBarButtonTool and GridToolBarToggleButtonTool that are used for custom actions and have an OnClick handler. Unlike the current custom Grid ToolBar tools, these new built-in tools will be able to show in the Grid ToolBar's overflow menu when the available horizontal space is limited.
Completed
Last Updated: 16 Mar 2026 06:37 by ADMIN
Release 2026 Q2
Created by: James
Comments: 0
Category: Grid
Type: Bug Report
0

An exception occurs if a Grid row is dropped in another empty Grid in RTL mode:

Error: System.FormatException: the input string '-1' was not in a correct format.

Unplanned
Last Updated: 18 Mar 2026 13:09 by ADMIN
During a recent penetration test on our Blazor application that uses Telerik Blazor UI components, a security finding was reported regarding the possibility of Excel macro injection through exported Excel files generated via the Telerik Excel Export feature. 
We would like Telerik to implement built‑in safeguards to automatically neutralize potential macro injection vectors.

The penetration test revealed that it is currently possible to insert values beginning with Excel formula metacharacters—such as =, +, -, and @—into fields that are later exported using Telerik’s Excel Export functionality.
In older versions of Microsoft Excel, these values may be interpreted and executed as formulas when users open the exported file. Even though newer Excel versions often warn users, this still presents a security concern and may violate corporate export or data‑handling policies.

See also this blogpost: https://blog.securelayer7.net/how-to-perform-csv-excel-macro-injection/

The Telerik Excel Export functionality should include an option to automatically sanitize or escape values that may pose a risk of Excel macro or formula injection.
- Automatic escaping of formula-starting characters: Prepend a single quote (') to any exported value beginning with: '=', '+', '-', '@'.
- Optional configuration flag to enable/disable this behavior, for example: <GridExcelExportSettings EscapeFormulas="true" />

While we can implement a workaround in our own application code, we believe this is a security concern that many customers may encounter, and therefore a native solution within the Telerik framework would be highly valuable.

We kindly request that Telerik consider adding a built‑in mechanism to protect against Excel macro injection in exported files. This would improve security, reduce custom development work, and strengthen the reliability of Telerik’s Blazor export functionality.
Unplanned
Last Updated: 11 Mar 2026 11:17 by Edo

Description

A column cannot be reordered by dragging beyond the currently visible columns of the Grid. This significantly limits the column reorder functionality only to the visible viewport.

Steps To Reproduce

  1. Run this example: https://blazorrepl.telerik.com/QqudFlYZ18zv7Gv547
  2. Drag a column header to the right border of the Grid.

Actual Behavior

The Grid does not scroll horizontally while the column is dragged.

Expected Behavior

The Grid scrolls horizontally while dragging the column and allows dropping it beyond the currently visible columns.

Browser

All

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

No response

Planned
Last Updated: 24 Mar 2026 13:31 by ADMIN
Scheduled for 2026 Q2

How to reproduce:

  1. Go to https://demos.telerik.com/blazor-ui/grid/editing-incell
  2. Go to the last Grid page, which has empty space below the last table row.
  3. Open any Grid cell for editing.
  4. Click on the empty space in the Grid below the last table row.
  5. The Grid does not exit edit mode like it should.

The regression was introduced in version 12.2.0. The last version that works correctly is 12.0.0.

The possible workarounds are:

@using System.ComponentModel.DataAnnotations
@using Telerik.DataSource
@using Telerik.DataSource.Extensions

<TelerikGrid @ref="@GridRef"
             OnRead="@OnGridRead"
             TItem="@Product"
             EditMode="@GridEditMode.Incell"
             OnCreate="@OnGridCreate"
             OnDelete="@OnGridDelete"
             OnUpdate="@OnGridUpdate"
             Height="600px">
    <GridToolBarTemplate>
        <GridCommandButton Command="Add">Add Item</GridCommandButton>
    </GridToolBarTemplate>
    <GridColumns>
        <GridColumn Field="@nameof(Product.Name)">
            <EditorTemplate>
                @{ var dataItem = (Product)context; }
                <span @onfocusout="@( async () => await OnGridCellFocusOut(nameof(Product.Name)) )">
                    <TelerikTextBox @bind-Value="@dataItem.Name" />
                </span>
            </EditorTemplate>
        </GridColumn>
        @* <GridColumn Field="@nameof(Product.Price)" DisplayFormat="{0:C2}" />
        <GridColumn Field="@nameof(Product.Quantity)" DisplayFormat="{0:N0}" />
        <GridColumn Field="@nameof(Product.ReleaseDate)" DisplayFormat="{0:d}" /> *@
        <GridColumn Field="@nameof(Product.Discontinued)" Width="120px">
            <EditorTemplate>
                @{ var dataItem = (Product)context; }
                <span @onfocusout="@( async () => await OnGridCellFocusOut(nameof(Product.Discontinued)) )">
                    <TelerikCheckBox @bind-Value="@dataItem.Discontinued" />
                </span>
            </EditorTemplate>
        </GridColumn>
        <GridCommandColumn Width="180px">
            <GridCommandButton Command="Delete">Delete</GridCommandButton>
        </GridCommandColumn>
    </GridColumns>
</TelerikGrid>

@code {
    private TelerikGrid<Product>? GridRef { get; set; }

    private ProductService GridProductService { get; set; } = new();

    private async Task OnGridCellFocusOut(string field)
    {
        await Task.Delay(100);

        if (GridRef is null)
        {
            return;
        }

        GridState<Product> gridState = GridRef.GetState();
        Product? editItem = gridState.EditItem as Product;

        if (editItem is null)
        {
            return;
        }

        GridCommandEventArgs args = new GridCommandEventArgs()
        {
             Field = field,
             Item = editItem
        };

        await OnGridUpdate(args);


        gridState.EditField = default;
        gridState.EditItem = default!;
        gridState.OriginalEditItem = default!;

        await GridRef.SetStateAsync(gridState);
    }

    private async Task OnGridCreate(GridCommandEventArgs args)
    {
        var createdItem = (Product)args.Item;

        await GridProductService.Create(createdItem);
    }

    private async Task OnGridDelete(GridCommandEventArgs args)
    {
        var deletedItem = (Product)args.Item;

        await GridProductService.Delete(deletedItem);
    }

    private async Task OnGridRead(GridReadEventArgs args)
    {
        DataSourceResult result = await GridProductService.Read(args.Request);

        args.Data = result.Data;
        args.Total = result.Total;
        args.AggregateResults = result.AggregateResults;
    }

    private async Task OnGridUpdate(GridCommandEventArgs args)
    {
        var updatedItem = (Product)args.Item;

        await GridProductService.Update(updatedItem);
    }

    public class Product
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; } = string.Empty;
        public string Description { get; set; } = string.Empty;
        public decimal? Price { get; set; }
        public int Quantity { get; set; }
        [Required]
        public DateTime? ReleaseDate { get; set; }
        public bool Discontinued { get; set; }
    }

    #region Data Service

    public class ProductService
    {
        private List<Product> Items { get; set; } = new();

        private int LastId { get; set; }

        public async Task<int> Create(Product product)
        {
            await SimulateAsyncOperation();

            product.Id = ++LastId;

            Items.Insert(0, product);

            return LastId;
        }

        public async Task<bool> Delete(Product product)
        {
            await SimulateAsyncOperation();

            if (Items.Contains(product))
            {
                Items.Remove(product);

                return true;
            }

            return false;
        }

        public async Task<List<Product>> Read()
        {
            await SimulateAsyncOperation();

            return Items;
        }

        public async Task<DataSourceResult> Read(DataSourceRequest request)
        {
            return await Items.ToDataSourceResultAsync(request);
        }

        public async Task<bool> Update(Product product)
        {
            await SimulateAsyncOperation();

            int originalItemIndex = Items.FindIndex(x => x.Id == product.Id);

            if (originalItemIndex != -1)
            {
                Items[originalItemIndex] = product;
                return true;
            }

            return false;
        }

        private async Task SimulateAsyncOperation()
        {
            await Task.Delay(100);
        }

        public ProductService(int itemCount = 5)
        {
            Random rnd = Random.Shared;

            for (int i = 1; i <= itemCount; i++)
            {
                Items.Add(new Product()
                {
                    Id = ++LastId,
                    Name = $"Product {LastId}",
                    Description = $"Multi-line\ndescription {LastId}",
                    Price = LastId % 2 == 0 ? null : rnd.Next(0, 100) * 1.23m,
                    Quantity = LastId % 2 == 0 ? 0 : rnd.Next(0, 3000),
                    ReleaseDate = DateTime.Today.AddDays(-rnd.Next(365, 3650)),
                    Discontinued = LastId % 2 == 0
                });
            }
        }
    }

    #endregion Data Service
}

 

Unplanned
Last Updated: 20 Feb 2026 12:17 by Amanatios Amanatidis
Created by: Amanatios Amanatidis
Comments: 0
Category: Grid
Type: Bug Report
3

Description

When clicking a Grid row and the Grid is in GridDataLayoutMode.Stacked mode, the RowClick event fires twice.

Steps To Reproduce

  1. Run this example: https://blazorrepl.telerik.com/QgkmvDvQ296Ea3Ij28
  2. Click a row in the Grid

Actual Behavior

The RowClick event fires twice.

Expected Behavior

The RowClick event fires once.

Browser

All

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

No response

Unplanned
Last Updated: 16 Feb 2026 14:45 by Marc
Created by: Marc
Comments: 0
Category: Grid
Type: Feature Request
1

The following KB article shows a workaround for removing the Grid aggregate labels ("Sum" and "Count") from the exported Excel document: https://www.telerik.com/blazor-ui/documentation/knowledge-base/grid-remove-aggregate-labels-in-excel-footr

It would be nice to have this option as a parameter in the Grid. It would allow to toggle on/off this behavior, instead of having to rely on custom code to work around it. 

Or in the OnBeforeExport method, add extra data to GridBeforeExcelExportEventArgs that contains the aggregates so they can be changed.

 private async Task OnBeforeExcelExport(GridBeforeExcelExportEventArgs args)
 {
     await Task.CompletedTask;

     // Loop through all columns and fix the footer aggregate values
     // Replace the default "Sum: 1234.56" text with just the decimal number
     foreach (var column in args.Columns)
     {
         if (column.HasAggregate)
         {
             // Set the number format for the column so Excel treats it as a number
             column.Aggregate.Field.Value == "MyNewValue";
         }
     }
 }
Duplicated
Last Updated: 19 Feb 2026 10:37 by Daniel

I created a subclass of the TelerikGrid to extend the limited built-in search functionality.

To do that, I use the GridStateChanged event to rewrite the SearchFilter: I replace the default filter with a more complex CompositeFilterDescriptor (including highlighting). This works perfectly during normal interaction.

Now I also want the search to be persisted, so that after reloading the page the grid shows the same search again. Saving the grid state is not a problem, but when restoring the saved state during OnStateInit / GridStateInit, the following exception occurs:


Unable to cast object of type 'Telerik.DataSource.CompositeFilterDescriptor' to type 'Telerik.DataSource.FilterDescriptor'.
System.InvalidCastException: Unable to cast object of type 'Telerik.DataSource.CompositeFilterDescriptor' to type 'Telerik.DataSource.FilterDescriptor'.
at Telerik.Blazor.Components.Common.TableGridBase`2.LoadSearchFilter(IFilterDescriptor descriptor)
at Telerik.Blazor.Components.TelerikGrid`1.SetStateInternalAsync(GridState`1 state)
at Telerik.Blazor.Components.TelerikGrid`1.InvokeOnStateInit()
at Telerik.Blazor.Components.TelerikGrid`1.OnParametersSetAsync()
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)
fail: Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost[111]
Unhandled exception in circuit 'MYsaCsOgfpbyHeO0xNFpA7ViPHNUC6rpc1K9eIwVR5Y'.
System.InvalidCastException: Unable to cast object of type 'Telerik.DataSource.CompositeFilterDescriptor' to type 'Telerik.DataSource.FilterDescriptor'.
at Telerik.Blazor.Components.Common.TableGridBase`2.LoadSearchFilter(IFilterDescriptor descriptor)
at Telerik.Blazor.Components.TelerikGrid`1.SetStateInternalAsync(GridState`1 state)
at Telerik.Blazor.Components.TelerikGrid`1.InvokeOnStateInit()
at Telerik.Blazor.Components.TelerikGrid`1.OnParametersSetAsync()
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

I also tried saving the search term and the selected columns separately and then restoring the state in OnAfterRender, but at that point the SearchFilter can no longer be set.


How should I approach this? Is there a supported way to persist and restore a custom CompositeFilterDescriptor as the grid’s search filter (or otherwise restore the search state) without triggering this cast exception?

 

Sincerly Daniel

 

 

Declined
Last Updated: 11 Feb 2026 14:45 by ADMIN

Hello,

we recently updated Telerik.UI.for.Blazor from 9.0.0 to 12.3.0, afterwords we noticed that in several instances where we use the `TelerikGrid` component, keyboard interactions stopped working. Specifically the `@onkeydown` seems to no longer propagate to parent elements of the grid. As this was not mentioned in the Breaking changes for the version 10 or 12 releases we assume this to be a bug.

here a simplified example:

            <div style="padding: 0; width: @(ShowSidePanel ? "65%" : "99%")" tabindex="0" @onkeydown="@(OnKeyPress)">
                <TelerikGrid TItem="IncomingInvoiceGridItemViewModel"
                             @ref="GridRef"
                             Class="admin-grid"
                             Height="@OverviewHeight"
                             RowHeight="50"
                             Pageable="false"
                             PageSize="PageSize"
                             FilterMode="@GridFilterMode.FilterMenu"
                             Sortable="true"
                             Resizable="true"
                             Reorderable="true"
                             ShowColumnMenu="true"
                             ScrollMode="@GridScrollMode.Virtual"
                             SelectionMode="@GridSelectionMode.Single"
                             OnStateInit="@OnStateInit_SetStateAsync"
                             OnStateChanged="@OnStateChanged_SaveStateAsync"
                             SelectedItemsChanged="@OnSelectedItemsChanged_LoadPdf"
                             OnRead="@OnRead_UpdateFilteredItems">
                    <GridSettings>
                        <GridColumnMenuSettings Lockable="false" />
                    </GridSettings>
...
<!-- aggregates, columns and noDataTemplate omitted -->
...
                </TelerikGrid>
            </div>

Implementation / usages of the features did not change, only updates where changes required by the update Telerik.UI.for.Blazor from 9.0.0 to 12.3.0.

These were the dependencies updated alongside the update of Telerik.UI.for.Blazor from 9.0.0 to 12.3.0 :

Declined
Last Updated: 16 Mar 2026 07:32 by ADMIN
Created by: Michal
Comments: 7
Category: Grid
Type: Bug Report
0

Hello,

seems like the GridToolbar(even the GridToolbarTemplate) in grid is not rendering "GridToolBarOverflowMode.Section". The "Scroll" mode is ok.

Is there any additional setup, or did i missed some setup...?

REPL:

 https://blazorrepl.telerik.com/wqYQvvEq40GkajEZ30

based on:
https://www.telerik.com/blazor-ui/documentation/components/grid/toolbar

some mention about "sections" but it seems for another purpose:

https://www.telerik.com/blazor-ui/documentation/knowledge-base/common-net8-sections

Thanks

Unplanned
Last Updated: 16 Mar 2026 10:49 by ADMIN
Created by: David
Comments: 2
Category: Grid
Type: Feature Request
1

Draft feature request (copy/paste)

Title: Add per-column value converters (WPF-style) to Telerik Blazor Grid columns

Product: UI for Blazor → Grid
Type: Feature Request

Description:
In Telerik UI for WPF, grid column definitions can reference a converter by name (e.g., IValueConverter) to transform values for display without writing a custom cell template for each column.

In Telerik UI for Blazor Grid, templates are currently the primary way to change how values render in a column (which works, but becomes repetitive across many columns/grids).

Request:
Add a column-level conversion API that allows specifying a converter/formatter function for display (and optionally editing). Example concepts:

  • Converter="nameof(MyConverters.StatusToText)"

  • or DisplayConverter="(item) => …" / ValueFormatter="Func<TItem, object, string>"

  • optionally ConvertBack-like support for editing scenarios (or separate EditConverter)

Why this is needed:

  • Reduces repeated <Template> markup for simple formatting/transformations

  • Centralizes formatting/conversion logic in reusable code

  • Improves maintainability and consistency across grids

  • Eases migration for teams coming from Telerik WPF where converters are a common pattern

Use cases:

  • Enum/int → user-friendly text

  • Boolean → “Yes/No”, icons, badges

  • Null/empty → placeholder text

  • Code → display name (via lookup)

  • Domain-specific formatting shared across many grids

Workarounds today:

  • Column <Template> or computed properties (both valid, but not as concise/reusable for large grids)

  • Extracting RenderFragments can reduce repetition, but still requires templating infrastructure for what is logically a simple conversion step

Expected behavior:

  • Converter applies consistently anywhere the column renders (cell, export if applicable, etc.)

  • Works with sorting/filtering in a predictable way (ideally sorting/filtering still uses raw field value unless explicitly configured)


 

Unplanned
Last Updated: 05 Feb 2026 13:49 by Ed
Created by: Ed
Comments: 0
Category: Grid
Type: Feature Request
1

The Grid's CheckBoxColumn doesn't support the TextAlign property, making it impossible to center the checkbox with just Grid markup, you have to resort to a workaround.

The TextAlign property in other columns causes style="text-align: center" to be added to the underlying table cell.  This would also work for the checkbox column.

See this test:

<table class="table">
    <tr>
        <td class="table-active" style="width: 40px; text-align: center"><input type="checkbox" /> </td>
        <td>test</td>
    </tr>
</table>

Please add the TextAlign property to the CheckboxColumn.

Completed
Last Updated: 03 Feb 2026 14:09 by ADMIN
Release 2026 Q1 (Feb)
Add support for customizable keyboard shortcuts in the Grid component, allowing developers to override default key bindings. Shortcuts can be configurable per scope (cell type or context), so the same key can trigger different actions depending on the user’s location in the Grid.
Unplanned
Last Updated: 28 Jan 2026 08:29 by Alex
Created by: Alex
Comments: 0
Category: Grid
Type: Feature Request
3

I want to reorder the Grid rows the same way I can reorder the columns - via the keyboard.

For reference: Telerik jQuery Grid drag and drop

Unplanned
Last Updated: 22 Jan 2026 12:24 by Alex
If the Sortable parameter is set to true, the focus after the toolbar goes to the first header cell. If the Sortable parameter is set to false, the focus skips the first header cell.
Unplanned
Last Updated: 22 Jan 2026 12:04 by Stephan

Column headers and column data do not match after reordering. 

See this example: https://blazorrepl.telerik.com/GKkFcwlF54CvZoVp34 

1. Reorder Group 1 and Group 2.

2. The column headers within these 2 groups are not reordered with their parent.

Reordering should work according to the rules specified in the documentation: https://www.telerik.com/blazor-ui/documentation/components/grid/columns/multi-column-headers#reordering

1 2 3 4 5 6