In Development
Last Updated: 13 Mar 2026 14:15 by ADMIN
Scheduled for 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.

In Development
Last Updated: 11 Mar 2026 14:05 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: 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

Declined
Last Updated: 10 Mar 2026 14:39 by Michal
Created by: Michal
Comments: 6
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: 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

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 :

Completed
Last Updated: 05 Feb 2026 11:46 by ADMIN
When you use Virtual Scrolling you cannot control the scroll position with the Skip parameter if the data is received after initializing the GridState.
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

Unplanned
Last Updated: 21 Jan 2026 11:13 by ADMIN
Created by: Michal
Comments: 1
Category: Grid
Type: Bug Report
0

Hello,

 there is inconsistency/behaviour/order in events of the Grid: OnStateInit and OnRead. Which leads to scenario with no clear sollution and would be nice to fix it, and how to solve it as "hotfix".
Also i think its not new in 12.x. release, it exists longer ;)


<TelerikGrid TItem="GData" @ref="gHL" OnRead=@GReadItems OnStateInit="@OnStateGHL"> ... <GridAggregates> @if(1==2){...} </GridAggregates> @code{ protected async Task GReadItems(GridReadEventArgs args) { **hack for C) if(gHL==null)return;//state init AVOID 2x call gread PRIOR OnStateInit

...// must be called: args.AggregateResults = rr.ToDataSourceResult(args.Request).AggregateResults;

... } void OnStateGHL(GridStateEventArgs<GData> args) //or async Task doesnt matter { //default SORTing:args.GridState = new GridState<GData> { SortDescriptors = new List<Telerik.DataSource.SortDescriptor> { new Telerik.DataSource.SortDescriptor{ Member = nameof(GData.DatPorizeni), SortDirection = Telerik.DataSource.ListSortDirection.Descending }, //new Telerik.DataSource.SortDescriptor{ Member = nameof(GData.Skupina), SortDirection = Telerik.DataSource.ListSortDirection.Ascending } } }; } }


Problematic scenarios, single page, same grid:

A) when NO aggregates markup EXISTS at all
1. OnStateInit
2. OnRead  - gHL IS NULL
=OK

B) when EMPTY aggregates markup EXISTS
1. OnRead
2. OnStateInit
=FAIL
HOW to read and ui data with correct STATE?
https://www.telerik.com/blazor-ui/documentation/components/grid/state

cannot call gHL.rebind, also gHL is null
NONE initinal "sorting,filtering etc" is set, WRONG data,columns,displayed to the user


C) when SOME real aggregates markup EXISTS
1. OnRead
2. OnStateInit
3. OnRead
=partial FAIL("**hack used"), but managed by if(gHL==null)return


D) "hotfix" used with  GridAggregates="@( HasAggregates ? GridAggregatesTemplate : null )"
act as A or C, but gHL is always null, which is also bad againts C)

Expected:
ALWAYS only A) - First 1.OnStateInit THEN 2.OnRead. its the best one, without any additional hacks = UNIFY the event orders and behaviour.
OR
A) or C)
everything else is unmanagable.
 Especially when initial sorting "is must" and aggregates,columns and so on, are managed by user(non static)
B) is completly WRONG: incorrect event order of OnStateInit and OnRead
D) is againts C) (cannot detect reference of gHL)

related to:
https://feedback.telerik.com/blazor/1654029-onstateinit-does-not-fire-if-gridaggregates-exists-but-is-empty

https://www.telerik.com/forums/grid-onstateinit-event-and-onread-event-chaos

OR how to solve it generally = what is the way to LOAD gridState, and after that, LOAD Data by defined GridState?

Thanks

Completed
Last Updated: 20 Jan 2026 13:08 by ADMIN
When the popup is larger than the browser/screen size, scrolling causes the popup to suddenly close
Unplanned
Last Updated: 15 Jan 2026 07:28 by ADMIN
Created by: Andrew
Comments: 4
Category: Grid
Type: Bug Report
4

Description

When going fast over the Grid rows with the mouse cursor, the rows are highlighted after a delay. The delay is more noticeable on higher resolutions (2560x1440 or higher).

Steps To Reproduce

  1. Hover the first Grid row and move the mouse cursor towards the last row (or vice versa).

Actual Behavior

In the app that targets .NET10 the row hover styles are applied with a delay, whereas in the app that targets .NET8 the hover styles are applied as soon as the mouse enters the boundaries of a row.

Expected Behavior

Similar performance in applying hover-related styles.

Browser

All

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

No response

Unplanned
Last Updated: 08 Jan 2026 15:37 by ADMIN

I am resetting the Grid State by calling Grid.SetState(null). This doesn't reset ColumnState<T>.Locked boolean to false and the columns remain locked.

---

ADMIN EDIT

---

A possible workaround for the time being is to additionally loop through the ColumnStates collection of the State and set the Locked property to false for each column.

Example: https://blazorrepl.telerik.com/QTYmkpvb49c6CPxa42

Declined
Last Updated: 08 Jan 2026 12:57 by ADMIN

When you type something in the grid searchbox, there will be a X at the end to clear the box.

However, if you restore the grid from previously stored state like localstorage, and if the box has value, the X is not there.

Thanks!

Completed
Last Updated: 05 Jan 2026 14:38 by ADMIN
Created by: Lukas
Comments: 4
Category: Grid
Type: Bug Report
0

On the bright side, I don't have to write a repro code sample for this issue since this is present in the example on https://www.telerik.com/blazor-ui/documentation/components/grid/templates/popup-form-template#example

  1. Open the edit popup for any item and close the window with the "x" in the top right
  2. Now click the button to add a new item

The popup for adding a new item now shows the values of the previously edited item. The same goes for editing any other item. As long as the popup is closed with the "x" in the top right, the edit context remains.

The Problem relates to the ExitGridEditMode method and when it is and isn't called. Specifically, it is not called when the edit popup is closed with the close button in the top right of the window. I have also not found any way to get notified about the edit popup being closed with the close button. The Grid contains a hard-coded <TelerikWindow> and there doesn't appear to be a way to influence this window action or any events that it triggers.

Completed
Last Updated: 17 Dec 2025 09:18 by ADMIN
Release 2026 Q1 (Feb)
Created by: Taarti
Comments: 4
Category: Grid
Type: Bug Report
28

In the case of a sorted column, NVDA is not narrating the correct column name and narrating the incorrect Roles for the column headers.

In the case of an unsorted column, NVDA is narrating the column name twice and repeating the information.

Unplanned
Last Updated: 02 Dec 2025 12:47 by simeon

When triggering Grid edit mode through the Grid state and the component is using adaptive mode, the edit form doesn't show.

Possible workarounds include:

Unplanned
Last Updated: 25 Nov 2025 14:38 by Stephan
If you try to resize a column in Grid with several locked columns, the process will be extremely slow and may even hang the browser.
Unplanned
Last Updated: 25 Nov 2025 13:39 by Rob

The Grid in-cell editor will not close if the user selects content in more than one cell in the component. This can lead to problems related to uncommitted new values if the user "forgets" to confirm their edits and navigates away.

https://demos.telerik.com/blazor-ui/grid/editing-incell

Observe the inconsistency:

  • While in edit mode, select the contents of another single cell. The cell in edit mode will close.
  • While in edit mode, drag the mouse to select multiple other cells. The cell in edit mode will not close.

===

A possible workaround is to use @onfocusout and the Grid state to detect the problematic behavior and close the edit cell programmatically:

https://blazorrepl.telerik.com/cJFbQIFE08y9GN8A02

1 2 3 4 5 6