Declined
Last Updated: 06 Mar 2026 09:36 by ADMIN
Michal
Created on: 11 Feb 2026 06:52
Category: Grid
Type: Bug Report
0
Grid - GridToolBarOverflowMode - Section - not showing

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

5 comments
ADMIN
Dimo
Posted on: 06 Mar 2026 09:36

Hi Michal,

Will the following enhancements meet your needs?

  • An Enabled parameter for all built-in GridToolBar tools. Currently some tools already manage their enabled state (e.g. Edit is enabled only if a row is selected). If the new Enabled parameter is set, the tool will no longer manage its state automatically and this will be the responsibility of the app.
  • A GridToolBarButtonTool and GridToolBarToggleButtonTool with an OnClick handler that executes arbitrary logic. These tools will participate in the GridToolBar overflow menu.

Regards,
Dimo
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Michal
Posted on: 04 Mar 2026 17:55

Thanks Dimo for the tips, but exactly thats why iam here :)

It also explains "enabled" state:

from user perspective is "confusing/span attention" that buttons/actions are sometimes hidden. Users like and expects action XYZ at exact possition forever. 1,2,3,4.... never wants 1,3,4 or worse 3,1.

Also, action bar is/maybe DEFINED by the user and actions are not always tied with row. GridToolbar/template is the only placeholder where to put tha actions and not break the layout(most of time). Its just action/button and its state is driven by BL,permissions etc.

So at exact possition is only solution to enable or disable button, or indicate by color that is innacessible, unclickable. And yes there are users with 10+ actions per grid and yes they are on devices with different width. adaptive-section mode is cool one, scroll not that much for desktop scenario.

And after that consideration, simple "button" does the any kind of generic approach - DIY. Adding enabled to existing tools which reacts on row state will be confusing - it was just suggestion, if its "simplier" for implemeting at some of the existing GridToolbarTools.

new:...GridToolbarButtonTool? GridToolbarCommandButtonTool? ability to place Toolbar inside "GridToolbar"(overkill), unify Toolbar and GridToolbar... AnyOne of this would fit nicely, last ones are "harder to implement" :)

 

ADMIN
Dimo
Posted on: 02 Mar 2026 06:37

Hello Michal,

Yes, we will update the documentation, this is really needed.

The standard Grid toolbar tools like GridToolBarAddTool are effectively command buttons, because they trigger Grid commands.

With regard to an Enabled parameter, can you describe in more detail why do you need it? Currently, some of the GridToolBar tools already use built-in logic for their enabled state. For example, the GridToolBarEditTool is enabled only when a row is selected. Exposing an Enabled parameter for only some tools may cause confusion, while exposing the parameter for all tools may not be possible with the current component algorithms.

A possible immediate workaround is to hide some tools instead of disabling them. The required approach is a bit tricky, in order to prevent tool reordering:

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

<TelerikCheckBox Value="@ShowAddCommand" ValueChanged="@ShowAddCommandChanged" TValue="@bool" />

<TelerikGrid OnRead="@OnGridRead"
             TItem="@Product"
             EditMode="@GridEditMode.Inline"
             OnCreate="@OnGridCreate"
             OnDelete="@OnGridDelete"
             OnUpdate="@OnGridUpdate">
    <GridSettings>
        <GridToolBarSettings OverflowMode="GridToolBarOverflowMode.Section"
                             ScrollButtonsPosition="GridToolBarScrollButtonsPosition.End"
                             ScrollButtonsVisibility="GridToolBarScrollButtonsVisibility.Visible">
        </GridToolBarSettings>
    </GridSettings>
    <GridToolBar>
        @if (ShowCommands)
        {
            @if (ShowAddCommand)
            {
                <GridToolBarAddTool>Add Item with long text</GridToolBarAddTool>
                <GridToolBarEditTool>Edit Item with long text</GridToolBarEditTool>
                <GridToolBarCsvExportTool>Export to CSV with long text</GridToolBarCsvExportTool>
                <GridToolBarExcelExportTool>Export to Excel with long text</GridToolBarExcelExportTool>
                <GridToolBarPdfExportTool>Export to PDF with long text</GridToolBarPdfExportTool>
            }
            else
            {
                <GridToolBarEditTool>Edit Item with long text</GridToolBarEditTool>
                <GridToolBarCsvExportTool>Export to CSV with long text</GridToolBarCsvExportTool>
                <GridToolBarExcelExportTool>Export to Excel with long text</GridToolBarExcelExportTool>
                <GridToolBarPdfExportTool>Export to PDF with long text</GridToolBarPdfExportTool>
            }
        }
    </GridToolBar>
    <GridColumns>
        <GridColumn Field="@nameof(Product.Name)" />
        <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" />
        <GridCommandColumn Width="180px">
            <GridCommandButton Command="Edit">Edit</GridCommandButton>
            <GridCommandButton Command="Save" ShowInEdit="true">Save</GridCommandButton>
            <GridCommandButton Command="Cancel" ShowInEdit="true">Cancel</GridCommandButton>
            <GridCommandButton Command="Delete">Delete</GridCommandButton>
        </GridCommandColumn>
    </GridColumns>
</TelerikGrid>

@code {
    private bool ShowCommands { get; set; } = true;
    private bool ShowAddCommand { get; set; } = true;

    private async Task ShowAddCommandChanged(bool newValue)
    {
        ShowCommands = false;
        await Task.Delay(1);
        ShowAddCommand = newValue;
        ShowCommands = true;
    }

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

    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
}

Regards,
Dimo
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Michal
Posted on: 22 Feb 2026 11:58

Hi Hristian,

 as you mentioned "GridCommandButton ", thats the primary goal to achive. Its fully understendable, that "complex/custom" markups are nogo.

 

So for now:

- would be nice to mention it in documentation(OverflowMode.Section + ONLY "GridToolBarXXXXX" are supported)

BUT:
- its not possible to just add any (simple control)BUTTON. At least grid built in "GridCommandButton " will be enought for most of the ordinary scenarios(Icon,OnClick,Enabled,Text)

- iam tried to fake it with GridToolBarAddTool or GridToolBarEditTool but that lacks Enabled state.

SO what about make it better:

- add support for grid built in buttons: something like GridCommandButton   
or:
- add "GridToolBarButton ?" - behave same as TelerikButton/GridCommandButton

Absolute awesome move :) :
- unify TelerikToolbar and GridToolbar, or allow TelerikToolbar inside grid placeholder

Make some of the suggestions sense?

Have a nice day

ADMIN
Hristian Stefanov
Posted on: 17 Feb 2026 21:04

Hi Michal,

With GridToolBarOverflowMode.Section mode set, the Grid renders a button, clicking on which opens a dropdown with the tools that do not fit the width of the Grid. 

However, only default tools are moved from the toolbar into the overflow dropdown. This feature does not work with custom tools (GridToolBarCustomTool), because a custom tool is not necessarily a GridCommandButton button. The custom tool can be used to show other more complex components within the toolbar, for example:

<GridToolBarCustomTool>
    <TelerikComboBox Data="@myComboData" TextField="MyTextField" ValueField="MyValueField" @bind-Value="selectedValue"
                        Placeholder="Select an item..." ShowClearButton="true" Filterable="true">
    </TelerikComboBox>
</GridToolBarCustomTool>

And while this works within the toolbar, it can quickly become problematic if the Grid attempts to render these more complex components in a dropdown with overflowing tools. In the example above that would mean rendering a ComboBox within another dropdown. Due to the custom tool's ability to contain arbitrary components, they are not rendered in the overflow dropdown. The  custom tool example I posted above contains  a ComboBox, but it could contain an even more complex component, not suitable to be shown in a dropdown.

For this reason, the overflow dropdown renders only default tools, e.g.,

<GridToolBarExcelExportTool>
</GridToolBarExcelExportTool>

As a result, when you have custom tools declared, they will remain in the toolbar regardless of the width of the Grid. And so when the Grid is narrow, as in the screenshots you posted, the custom tools may take all the real estate and push the overflow button to the right. It will remain hidden, because there is no space for it to show up. And it won't show up, because unlike the default tools that will get moved to the overflow dropdown when the space is not enough, the custom tools do not.

Our recommendation would be to set GridToolBarOverflowMode.Scroll, if you plan on using custom tools. With Scroll enabled, all the tools (default and custom) remain the the toolbar and are scrollable. You can use Section, if there are no custom tools declared, otherwise the lack of hiding mechanism for them may cause the issues you've came across at certain Grid width values.

    Regards,
    Hristian Stefanov
    Progress Telerik

    Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.