Setting grid filter operator is lost if clear the filter value

1 Answer 26 Views
Grid
Claudio
Top achievements
Rank 2
Bronze
Bronze
Iron
Claudio asked on 23 Jul 2025, 11:54 AM

Hi, i have a grid with row filter.

 

1. I change filter operator from the relative button

2. I edit the search field column

The grid show me the correct results.

Now if i clear the search field column, the filter operator automatically reset to the default value and not keep the settings i choose in step 1.

 

You can reply the issue with the first example in grid documentation: https://www.telerik.com/blazor-ui/documentation/components/grid/overview

The filter operator must keep my initial settings

It's a bug? how to solve?

Thanks

1 Answer, 1 is accepted

Sort by
0
Dimo
Telerik team
answered on 28 Jul 2025, 08:40 AM

Hello Claudio,

The purpose of the "Clear" button is to reset the whole filter state of the column, and not just the filter value. In addition, when the user deletes a filter value, the whole filter descriptor is removed from the Grid state too. Thus, the observed behavior is expected. I agree that there can be nuances and personal preferences in this scenario, which we cannot predict or assume, so we have used a more general approach and logic.

If you wish to preserve the column's non-default filter operator for future filter values, you can do it with events and operations related to the Grid state:

@using Telerik.DataSource

<TelerikGrid Data="@GridData"
             TItem="@Product"
             FilterMode="GridFilterMode.FilterRow"
             Pageable="true"
             Sortable="true"
             OnStateChanged="@OnGridStateChanged">
    <GridColumns>
        <GridColumn Field="@nameof(Product.Name)" />
        <GridColumn Field="@nameof(Product.Group)" />
        <GridColumn Field="@nameof(Product.Price)" DisplayFormat="{0:c2}" />
        <GridColumn Field="@nameof(Product.Quantity)" DisplayFormat="{0:n0}" />
        <GridColumn Field="@nameof(Product.Released)" DisplayFormat="{0:d}" />
        <GridColumn Field="@nameof(Product.Discontinued)" />
    </GridColumns>
</TelerikGrid>

@code {
    private List<Product> GridData { get; set; } = new();

    private List<FilterDescriptor> SavedGridFilters { get; set; } = new();
    private Dictionary<string, FilterOperator> ClearedGridFilters { get; set; } = new();

    private void OnGridStateChanged(GridStateEventArgs<Product> args)
    {
        // Detect and save cleared filters
        if (args.PropertyName == "FilterDescriptors")
        {
            IEnumerable<CompositeFilterDescriptor> currentFilters = args.GridState.FilterDescriptors.OfType<CompositeFilterDescriptor>();

            foreach (FilterDescriptor savedOneColumnFd in SavedGridFilters)
            {
                string savedMember = savedOneColumnFd.Member;
                object savedFilterValue = savedOneColumnFd.Value;
                FilterOperator savedOperator = savedOneColumnFd.Operator;

                if (!string.IsNullOrEmpty(savedFilterValue?.ToString()))
                {
                    FilterDescriptor? currentOneColumnFd = currentFilters
                        .FirstOrDefault(x => x.FilterDescriptors.OfType<FilterDescriptor>().Any(y => y.Member == savedMember))?
                        .FilterDescriptors.OfType<FilterDescriptor>().First();

                    if (currentOneColumnFd is null)
                    {
                        if (ClearedGridFilters.ContainsKey(savedMember))
                        {
                            ClearedGridFilters[savedMember] = savedOperator;
                        }
                        else
                        {
                            ClearedGridFilters.Add(savedMember, savedOperator);
                        }
                    }
                }
            }

            SavedGridFilters.Clear();

            // Iterate current filters
            foreach (CompositeFilterDescriptor currentOneColumnCfd in currentFilters)
            {
                IEnumerable<FilterDescriptor> currentOneColumnFds = currentOneColumnCfd.FilterDescriptors.OfType<FilterDescriptor>();

                string currentMember = currentOneColumnFds.First().Member;
                FilterOperator currentOperator = currentOneColumnFds.First().Operator;
                object currentValuе = currentOneColumnFds.First().Value;

                // Detect new filter value after clearing and restore previous operator
                if (ClearedGridFilters.ContainsKey(currentMember))
                {
                    currentOneColumnFds.First().Operator = currentOperator = ClearedGridFilters[currentMember];
                    ClearedGridFilters.Remove(currentMember);
                }

                // Save current filter state
                SavedGridFilters.Add(new FilterDescriptor() { Member = currentMember, Operator = currentOperator, Value = currentValuе });
            }
        }
    }

    protected override void OnInitialized()
    {
        var rnd = Random.Shared;

        for (int i = 1; i <= 57; i++)
        {
            GridData.Add(new Product()
            {
                Id = i,
                Name = $"Name {i} {(char)rnd.Next(65, 91)}{(char)rnd.Next(65, 91)}",
                Group = $"Group {i % 3 + 1}",
                Price = rnd.Next(1, 100) * 1.23m,
                Quantity = rnd.Next(0, 10000),
                Released = DateTime.Today.AddDays(-rnd.Next(60, 1000)),
                Discontinued = i % 4 == 0
            });
        }
    }

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public string Group { get; set; } = string.Empty;
        public decimal Price { get; set; }
        public int Quantity { get; set; }
        public DateTime Released { get; set; }
        public bool Discontinued { get; set; }
    }
}

 

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.

Tags
Grid
Asked by
Claudio
Top achievements
Rank 2
Bronze
Bronze
Iron
Answers by
Dimo
Telerik team
Share this question
or