DataGrid Filtering Issue After Upgraded From Radzen Component 6.6.3 to 7.0.0

Hi Radzen Team,

I want to report an issue encountered with the RadzenDataGrid Component 7.0.0 upon entering filter text, which results in an unhandled exception. The details are as follows:

Exception Details:

Unhandled exception: Value cannot be null. (Parameter 'type'): System.ArgumentNullException: Value cannot be null. (Parameter 'type') 
at Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize`1.BuildRenderTree(RenderTreeBuilder builder) 
at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)

at Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize`1.BuildRenderTree(RenderTreeBuilder builder) 
at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException

This issue occurs irrespective of the filter mode used (Advanced, Simple, or SimpleWithMenu). The datagrid is bound to an IEnumerable<IDictionary<string, string?>>.

Here's how my datagrid looks like:

<RadzenDataGrid @ref="_volumeGrid" LoadData="@LoadDataAsync" ColumnWidth="250px" AllowColumnReorder="true" AllowFiltering="true" AllowColumnResize="true" FilterMode="FilterMode.SimpleWithMenu" AllowSorting="true" Data="@_activeVolumeRecords" TItem="IDictionary<string, string?>" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" LogicalFilterOperator="LogicalFilterOperator.And" AllowVirtualization="true" Style="position: relative; height: 100%" SelectionMode="DataGridSelectionMode.Single" Count="@_count" AllowColumnPicking="true" ColumnsPickerAllowFiltering="true" AllowMultiColumnSorting=true RowSelect=@(args => OnRowSelect(args)) CellContextMenu="@OnCellContextMenu" Filter="@(args => OnFilterSet(args))" FilterCleared="@(args => OnFilterCleared(args))" Sort="@OnSort">

@{
int initialVisbleColumnCounter = 0;
foreach (DataColumn c in _volumeDataTable.Columns)
{

            bool isVisible = true;

            if (c.ColumnName.ToLower() != "docid" && initialVisbleColumnCounter > 10)
            {
                isVisible = false;
            }

            if (c.ColumnName != "InternalID")
            {

                <RadzenDataGridColumn Visible="@isVisible" Type="typeof(string)" TItem="IDictionary<string, string?>" Context="data" Property="@c.ColumnName"  Title="@c.ColumnName">
                    <Template>
                        <div data-parent-row-id="@(data[_intIdColumnName])" title="@(data[c.ColumnName])"> @(data[c.ColumnName])</div>
                    </Template>
                </RadzenDataGridColumn>
            }

            initialVisbleColumnCounter += 1;
        }
    }


</Columns>

This has been functioned correctly up to Radzen Component version 6.6.3. However, upon upgrading to version 7.0.0, this issue arose. It may be related to the breaking change mentioned in the release notes regarding the removal of the Microsoft.CodeAnalysis dependency, which was replaced with Radzen's own ExpressionParser.

Additionally, a similar error was encountered in the exception logs, though it occurred only once, and the trigger is uncertain:

Additional Exception Details:

Unhandled exception: Value cannot be null. (Parameter 'type'): System.ArgumentNullException: Value cannot be null. (Parameter 'type')
at System.ArgumentNullException.Throw(String paramName)
at System.Linq.Expressions.Expression.Property(Expression expression, Type type, String propertyName)
at Radzen.QueryableExtension.GetNestedPropertyExpression(Expression expression, String property, Type type)
at Radzen.QueryableExtension.GetExpression[T](ParameterExpression parameter, FilterDescriptor filter, FilterCaseSensitivity filterCaseSensitivity, Type type)
at Radzen.QueryableExtension.ToFilterString[T](IEnumerable1 columns) at Radzen.Blazor.RadzenDataGrid1.InvokeLoadData(Int32 start, Int32 top)
at Radzen.Blazor.RadzenDataGrid1.ReloadInternal() at Radzen.Blazor.RadzenDataGrid1.OnSort(EventArgs args, RadzenDataGridColumn`1 column)
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

Stack Trace:

at System.ArgumentNullException.Throw(String paramName)
at System.Linq.Expressions.Expression.Property(Expression expression, Type type, String propertyName)
at Radzen.QueryableExtension.GetNestedPropertyExpression(Expression expression, String property, Type type)
at Radzen.QueryableExtension.GetExpression[T](ParameterExpression parameter, FilterDescriptor filter, FilterCaseSensitivity filterCaseSensitivity, Type type)
at Radzen.QueryableExtension.ToFilterString[T](IEnumerable1 columns) at Radzen.Blazor.RadzenDataGrid1.InvokeLoadData(Int32 start, Int32 top)
at Radzen.Blazor.RadzenDataGrid1.ReloadInternal() at Radzen.Blazor.RadzenDataGrid1.OnSort(EventArgs args, RadzenDataGridColumn`1 column)
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

Could you please provide guidance on how to troubleshoot this issue?

Thank you for your attention to this issue!

You compare your implementation to this demo where everything works correctly:

I am also having an issue with filtering the RadzenDataGrid in the new 7.0 version.

I am using Dynamic Data Columns and have subscribed to the LoadData event.
I am using the Simple FilterMode.

In 6.6.4 filtering works.
In 7.0+ the LoadData handler is not called.

I've tested this a few times without changing the code at all.
The only variable is the installed version of the Radzen Components from Nuget.

We need runnable code that reproduces the problem.

The code below recreates the issue I am experiencing.

I have tested with Radzen version 6.6.4, and 7.0.x.

With version 6 - the filtering works.
With version 7 the 'LoadData' Eventhandler does not fire.

I am using Visual Studio 22 with a new Blazor Project Template Using .Net 9 and Server interactivity.

@page "/"

@rendermode RenderMode.InteractiveServer

<RadzenDataGrid Data="@activeData" TItem="IDictionary<string, MachineInfo>" ColumnWidth="200px"
LoadData="@OnLoadData"
AllowFiltering="true" FilterPopupRenderMode="PopupRenderMode.OnDemand"
FilterMode="FilterMode.Simple">
    <Columns>
        @foreach (var column in columns)
        {
            @if (column.Key == "Machine")
            {
                <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value" Filterable="true" FilterOperator="FilterOperator.StartsWith"
                Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                    <Template>
                        @context[@column.Key].MachineNumber
                    </Template>
                </RadzenDataGridColumn>
            }
            else
            {
                <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value" Filterable="false"
                Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                    <Template>
                        @context[@column.Key].Revenue
                    </Template>
                </RadzenDataGridColumn>
            }
        }
    </Columns>
</RadzenDataGrid>

@code {

    public IEnumerable<IDictionary<string, MachineInfo>> data { get; set; }
    public IEnumerable<IDictionary<string, MachineInfo>> activeData { get; set; }

    public int count { get; set; }
    public IDictionary<string, Type> columns { get; set; }

    private async Task OnLoadData(LoadDataArgs args)
    {
        if (data == null) return;

        Console.WriteLine("Load Data EventHandler executed");

        var query = data.AsQueryable();
        if (args.Filters.Count() > 0)
        {
            try
            {
                Console.WriteLine($"FilterValue: {args.Filters.First().FilterValue.ToString()}");

                query = query.Where(x => x["Machine"].MachineNumber.StartsWith(args.Filters.First().FilterValue.ToString()));
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Filter error: {ex.Message}");
            }
        }

        count = query.Count();
        activeData = await Task.FromResult(query.Skip(args.Skip.Value).Take(args.Top.Value).ToList());
        Console.WriteLine(activeData.Count());
    }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        var _columns = new Dictionary<string, Type>();
        var _data = new List<IDictionary<string, MachineInfo>>();
        var MachineList = GenerateMachineDate();

        _columns.Add("Machine", typeof(string));

        foreach (DateTime bd in MachineList.Select(o => o.BusinessDay).Distinct())
        {
            _columns.Add(bd.ToString("dd-MMM-yy"), typeof(string));
        }

        foreach (IGrouping<string, MachineInfo> macGroup in MachineList.GroupBy(o => o.MachineNumber))
        {
            Dictionary<string, MachineInfo> bdDictionary = new Dictionary<string, MachineInfo>();

            bdDictionary.Add("Machine", macGroup.First());

            foreach(KeyValuePair<string, Type> kvp in _columns.Skip(1))
            {
                MachineInfo mi = macGroup.First(x => x.BusinessDay.ToString("dd-MMM-yy") == kvp.Key);
                bdDictionary.Add(kvp.Key, mi);
            }
            _data.Add(bdDictionary);
        }

        columns = _columns;
        data = _data;
    }
    
    private List<MachineInfo> GenerateMachineDate()
    {
        int macNum = 10;
        var MachineInfoList = new List<MachineInfo>();

        for(int i = 0; i < 90; i++)
        {
            for(int j = -4; j < 1; j++)
            {
                MachineInfo machineInfo = new MachineInfo()
                    {
                        MachineNumber = (macNum * i).ToString(),
                        BusinessDay = DateTime.Today.AddDays(j),
                        Revenue = i * i,
                        Variance = 0
                    };
                    MachineInfoList.Add(machineInfo);
            }            
        }

        return MachineInfoList;
    }

    public class MachineInfo
    {
        public string MachineNumber { get; set; }
        public DateTime BusinessDay { get; set; }
        public int Revenue { get; set; }
        public int Variance { get; set; }

    }

}


My code example to produce the error in my particular case is similar to gMac too.

<RadzenDataGrid @bind-Value=@selectedItems Data="@data" TItem="IDictionary<string, string>" ColumnWidth="200px"
AllowFiltering="true" FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true">

@foreach (var column in columns)
{
<RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="typeof(string)"
Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">

@context[@column.Key]


}

@code {
IList<IDictionary<string, string>> selectedItems;

public IEnumerable<IDictionary<string, string>> data { get; set; }

public IDictionary<string, Type> columns { get; set; }

public enum EnumTest
{
    EnumValue1,
    EnumValue2
}

protected override async Task OnInitializedAsync()
{
    await base.OnInitializedAsync();

    columns = new Dictionary<string, Type>()
    {
        { "Employee ID", typeof(string) },
        { "MyColumn", typeof(string) },
      
    };



    data = Enumerable.Range(0, 100).Select(i =>
    {
        var row = new Dictionary<string, string>();

        foreach (var column in columns)
        {
            row.Add(
                column.Key,
               $"{column.Key}{i}" 
            );
        }

        return row;
    }).ToList();
}

}

It throws the following exception:

blazor.web.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: '(String)it' is not a member of type 'System.Collections.Generic.IDictionary2[System.String,System.String]' (Parameter 'propertyOrFieldName') System.ArgumentException: '(String)it' is not a member of type 'System.Collections.Generic.IDictionary2[System.String,System.String]' (Parameter 'propertyOrFieldName')
at System.Linq.Expressions.Expression.PropertyOrField(Expression expression, String propertyOrFieldName)
at Radzen.QueryableExtension.GetNestedPropertyExpression(Expression expression, String property, Type type)
at Radzen.QueryableExtension.GetExpression[IDictionary2](ParameterExpression parameter, FilterDescriptor filter, FilterCaseSensitivity filterCaseSensitivity, Type type) at Radzen.QueryableExtension.ToFilterString[IDictionary2](IEnumerable1 columns) at Radzen.Blazor.RadzenDataGrid1.d__530[[System.Collections.Generic.IDictionary2[[System.String, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at Radzen.Blazor.RadzenDataGrid1.............................

Hi Vladimir,
It looks like in 7.0.0, the expression parser does not like IDictionary<string, string> for dynamic data and we need to use IDictionary<string, object>. In my application, IDictionary<string, string> is used across many function calls that interact with the datagrid so going through the entire app to make the change is going to be a major challenge. Any suggestions on how I could continue to use IDictionary<string, string> to work with the datagrid component? Perhaps Radzen can add back support for IDictionary<string, string> to use for dynamic data?

Thank you.

Hey @chiku31,

Check the demo I've already linked in this thread - the DataGrid is bound exactly to IDictionary<string, object>. You can also at least format your code to allow copy and test in our demos (they are editable).

@gMac When using LoadData event you should provide Count for the DataGrid - check our demos for reference.7

Here is also our dynamic data demo using LoadData binding:

@using System.Linq.Dynamic.Core;

<RadzenDataGrid @ref="grid" Count="@count" LoadData="@LoadData" @bind-Value=@selectedItems Data="@data" TItem="IDictionary<string, object>" ColumnWidth="200px"
AllowFiltering="true" FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true">
    <Columns>
        @foreach (var column in columns)
        {
            <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value"
            Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                <Template>
                    @context[@column.Key]
                </Template>
            </RadzenDataGridColumn>
        }
    </Columns>
</RadzenDataGrid>

@code {
    IList<IDictionary<string, object>> selectedItems;

    public IEnumerable<IDictionary<string, object>> allData { get; set; }
    public IEnumerable<IDictionary<string, object>> data { get; set; }

    public IDictionary<string, Type> columns { get; set; }

    public enum EnumTest
    {
        EnumValue1,
        EnumValue2
    }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        columns = new Dictionary<string, Type>()
        {
            { "Employee ID", typeof(int?) },
            { "MyColumn", typeof(EnumTest?) },
            { "FirstName", typeof(string) },
            { "LastName", typeof(string) },
            { "HireDate", typeof(DateTime?) },
            { "DateOnly", typeof(DateOnly?) },
            { "TimeOnly", typeof(TimeOnly?) },
            { "UID", typeof(Guid?) },
        };

        foreach (var i in Enumerable.Range(0, 50))
        {
            columns.Add($"Column{i}", typeof(string));
        }

        allData = Enumerable.Range(0, 100).Select(i =>
        {
            var row = new Dictionary<string, object>();

            foreach (var column in columns)
            {
                row.Add(
                    column.Key,
                    column.Value == typeof(EnumTest?)
                        ? i == 0 ? null : (i % 2 == 0 ? EnumTest.EnumValue1 : EnumTest.EnumValue2)
                        : column.Value == typeof(int?)
                            ? i == 0 ? null : i
                            : column.Value == typeof(DateTime?)
                                ? i == 0 ? null : DateTime.Now.AddMonths(i)
                                : column.Value == typeof(Guid?)
                                ? i == 0 ? null : Guid.NewGuid()
                                : column.Value == typeof(DateOnly?)
                                ? i == 0 ? null : DateOnly.FromDateTime(DateTime.Now.AddMonths(i))
                                : column.Value == typeof(TimeOnly?)
                                ? i == 0 ? null : TimeOnly.FromDateTime(DateTime.Now.AddMonths(i))
                                : $"{column.Key}{i}" 
                );
            }

            return row;
        }).ToList();

        data = allData;
    }

    int count;  
    RadzenDataGrid<IDictionary<string, object>> grid;
    bool isLoading;
    async Task LoadData(LoadDataArgs args)
    {
        isLoading = true;

        await Task.Yield();

        var query = allData.AsQueryable();

        if (!string.IsNullOrEmpty(args.Filter))
        {
            // Filter via the Where method
            query = query.Where(grid.ColumnsCollection);
        }

        if (!string.IsNullOrEmpty(args.OrderBy))
        {
            // Sort via the OrderBy method
            query = query.OrderBy(args.OrderBy);
        }

        // Important!!! Make sure the Count property of RadzenDataGrid is set.
        count = query.Count();

        // Perform paging via Skip and Take.
        data = query.Skip(args.Skip.Value).Take(args.Top.Value).ToList();

        isLoading = false;
    }
}

Hi Vladimir,
Thank you for your response. I understand that the Radzen demo, that you provided, bond to IEnumerable<IDictionary<string, object>> which works as expected. However, I am wondering if there's a way to bound to IEnumerable<IDictionary<string, string?>> and not getting the following exception:

Unhandled exception rendering component: '(String)it' is not a member of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' (Parameter 'propertyOrFieldName')?

If I modify the demo from IEnumerable<IDictionary<string, object>> to IEnumerable<IDictionary<string, string?>> in the Radzen site and run it directly there, I get the above unhandled exception too.

In my application, IDictionary<string, string?> is used across many function calls that interact with the datagrid so going through the entire app to make the change to IDictionary<string, object> is going to be a major challenge. Any suggestions on how I could continue to use IDictionary<string, string?> to work with the datagrid component? Perhaps Radzen can add back support for IDictionary<string, string?> to use for dynamic data?

Thank you,.

I've added support for that - it will be part of our next update later today:

Hi Vladimir,
This is awesome! Will it also handle typeof(IDictionary<string, string?>) nullable type? Thanks.

Yes, just tested the following code and it worked as expected:

<RadzenDataGrid @bind-Value=@selectedItems Data="@data" TItem="IDictionary<string, string?>" ColumnWidth="200px"
                AllowFiltering="true" FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true">
    <Columns>
        @foreach (var column in columns)
        {
            <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value"
                                  Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                <Template>
                    @context[@column.Key]
                </Template>
            </RadzenDataGridColumn>
        }
    </Columns>
</RadzenDataGrid>

@code {
    IList<IDictionary<string, string?>> selectedItems;

    public IEnumerable<IDictionary<string, string?>> data { get; set; }

    public IDictionary<string, Type> columns { get; set; }

    public enum EnumTest
    {
        EnumValue1,
        EnumValue2
    }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        columns = new Dictionary<string, Type>()
        {
            { "FirstName", typeof(string) },
            { "LastName", typeof(string) },
        };

        foreach (var i in Enumerable.Range(0, 50))
        {
            columns.Add($"Column{i}", typeof(string));
        }

        data = Enumerable.Range(0, 100).Select(i =>
        {
            var row = new Dictionary<string, string?>();

            foreach (var column in columns)
            {
                row.Add(
                    column.Key,
                    $"{column.Key}{i}" 
                );
            }

            return row;
        }).ToList();
    }
}

Hi @enchev

I updated the code with the Count property, but the same issue occurs - The LoadData eventhandler isn't called when attempting to filter.

I can see that in your example, the data is bound to a IDictionary<string, object> the filtering works.

My Data is bound to IDictionary<string, MachineInfo> which is probably causing the issue in version 7.
In the real world, the MachineInfo object contains multiple properties that I use to change the appearance of each cell. My example is the abbreviated version of the actual class.

I'll either have find a workaround using the CellRender callback, or just keep using version 6.6.4.

We will do our best to provide support for this in our upcoming update later today.

1 Like

Here is the fix:

When you update to the latest version after our release you will need however to change how this column is declared since at the moment the Property is not valid, should be:

Property=@($"{PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)}.MachineNumber")
1 Like

Thanks @enchev

Filtering works now with the update and the code change you provided.

Hi Vladimir,
Thank you so much for the quick fix. I also confirm that the update has fixed the IDictionary<string,string> filter issue. It works great now.

However, I run into a second problem now. Previously, I was able to do something like this:

<RadzenDataGridColumn Visible="true" Type="typeof(DateTime)" TItem="IDictionary<string, string?>" Context="data" Property="ReceivedTime"Title="ReceivedTime">

@data["ReceivedTime"]

This trick allows me to use the date filter dialog popup to set the date filter conditions, and I would receive the filter values in LoadDataArgs args. There, I use my own parser to perform the filter logics.

if (!string.IsNullOrEmpty(args.Filter))
{

 string searchExpression = ConstructSearchExpression(args.Filters);

 //rest of the code has been removed

}

I revised the column declaration based on the new Radzen expression parser:

<RadzenDataGridColumn Visible="true" Type="typeof(DateTime)" TItem="IDictionary<string, string?>" Context="data" Property="@PropertyAccess.GetDynamicPropertyExpression("ReceivedTime", typeof(string))" Title="ReceivedTime">

<div title="@(data["ReceivedTime"])"> @(data["ReceivedTime"])

I am getting the following exception:

System.InvalidOperationException: No coercion operator is defined between types 'System.String' and 'System.DateTime'.
at Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize`1.BuildRenderTree(RenderTreeBuilder builder)
at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)

Because of this exception, the app crashes before it gets to LoadData(LoadDataArgs args) where I could run my own logics.

Do you have any workaround for this?

Thank you.

You can use FilterTemlate/FilterValueTemplate to define custom filter for that column and keep the Type string:

@using System.Linq.Dynamic.Core;

<RadzenDataGrid @ref="grid" Count="@count" LoadData="@LoadData" @bind-Value=@selectedItems Data="@data" TItem="Dictionary<string, string?>" ColumnWidth="200px"
AllowFiltering="true" FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true">
    <Columns>
        @foreach (var column in columns)
        {
            if (column.Key == "HireDate")
            {
                <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value"
                                      Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                    <Template>
                        @context[@column.Key]
                    </Template>
                    <FilterValueTemplate>
                        <RadzenDatePicker @bind-Value=@hireDate />
                    </FilterValueTemplate>
                </RadzenDataGridColumn>
            }
            else
            {
                <RadzenDataGridColumn @key=@column.Key Title="@column.Key" Type="column.Value"
                    Property="@PropertyAccess.GetDynamicPropertyExpression(column.Key, column.Value)">
                    <Template>
                        @context[@column.Key]
                    </Template>
                </RadzenDataGridColumn>
            }
        }
    </Columns>
</RadzenDataGrid>

@code {
    DateTime? hireDate;
    IList<Dictionary<string, string?>> selectedItems;

    public IEnumerable<Dictionary<string, string?>> allData { get; set; }
    public IEnumerable<Dictionary<string, string?>> data { get; set; }

    public IDictionary<string, Type> columns { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        columns = new Dictionary<string, Type>()
        {
            { "FirstName", typeof(string) },
            { "LastName", typeof(string) },
            { "HireDate", typeof(string) },
        };

        allData = Enumerable.Range(0, 100).Select(i =>
        {
            var row = new Dictionary<string, string?>();

            foreach (var column in columns)
            {
                row.Add(
                    column.Key,
                    $"{column.Key}{i}"
                );
            }

            return row;
        }).ToList();

        data = allData;
    }

    int count;
    RadzenDataGrid<Dictionary<string, string?>> grid;
    bool isLoading;
    async Task LoadData(LoadDataArgs args)
    {
        isLoading = true;

        await Task.Yield();

        var query = allData.AsQueryable();

        if (!string.IsNullOrEmpty(args.Filter))
        {
            query = query.Where(grid.ColumnsCollection);
        }

        if (!string.IsNullOrEmpty(args.OrderBy))
        {
            query = query.OrderBy(args.OrderBy);
        }

        count = query.Count();
        data = query.Skip(args.Skip.Value).Take(args.Top.Value).ToList();
        isLoading = false;
    }
}

Thank you for the suggestion! I'll give that you try.

Hi Vladimir,
Following your example, I replaced the "date" column with the following code:

<RadzenDataGridColumn Visible="true" Type="typeof(string)" TItem="IDictionary<string, string?>" Context="data" Property="@PropertyAccess.GetDynamicPropertyExpression("SentOn", typeof(string))" Title="SentOn" FilterValue="@_filterValueSentOnDate?.Date"
FilterOperator="FilterOperator.Equals" FilterOperators="@(new FilterOperator{ FilterOperator.Equals, FilterOperator.NotEquals, FilterOperator.LessThan,FilterOperator.NotEquals,FilterOperator.LessThanOrEquals,FilterOperator.GreaterThan,FilterOperator.GreaterThanOrEquals,FilterOperator.IsNull,FilterOperator.IsNotNull})">

<div title="@(data["SentOn"])"> @(data["SentOn"])


<RadzenDatePicker @bind-Value=@_filterValueSentOnDate Style="width:100%;" AllowClear="true" DateFormat="d" />

However, it is not firing neither the Filter nor the FilterCleared event upon choosing and clearing the value in the date picker control. I added break points in these callbacks, and they are not reached.

Any suggestions?

Thank you.