Data Filter does not come back initial state after clear?

Hi,

I am using data filter to filter a data grid.When I select Vendor name from data filter drop down, the data grid successfully filters. But after I clear the Vendor name from the data filter drop down, the data grid is not displaying the initial data, keep displaying the filtered data instead.

How can I make it display the initial data after clearing the data filter?

Working sample:

@page "/Stock"
@using System.Globalization
@using System.Security.Claims
@using AutoMapper
@using IMS.CoreBusiness
@using IMS.CoreBusiness.DTO
@using IMS.UseCases.Customers
@using IMS.UseCases.Interfaces.Stocks
@using IMS.UseCases.Interfaces.Vendor
@using IMS.UseCases.Orders
@using IMS.UseCases.Stocks
@using IMS.UseCases.Vendors
@using IMS.UseCases.WarehouseAddress
@using OfficeOpenXml
@using OfficeOpenXml.Style
@using VendorDto = IMS.CoreBusiness.DTO.VendorDto
@inject IJSRuntime JS
@inject AuthenticationStateProvider _authenticationStateProvider
@inject ILogger<Stock> _logger
@inject IMapper Mapper
@inject NavigationManager NavigationManager
@inject IViewAllVendorsUseCase ViewAllVendorsUseCase
@inject DialogService DialogService
@inject IAddStockUseCase AddStockUseCase
@inject IUpdateStocksUseCase UpdateStocksUseCase
@inject ICancelStockUseCase CancelStockUseCase
@inject IDeleteStockUseCase DeleteStockUseCase
@inject IViewStocksUseCase ViewStocksUseCase


<PageTitle>Stock</PageTitle>
<h1>Stocks</h1>
<RadzenCard class="mb-3">
    <RadzenDataFilter @ref="dataFilter" Auto="true" Data="@stockDto" TItem="StockDto" ViewChanged="@(view => filteredStocks = view.ToList())"
    FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive">
        <Properties>
            <RadzenDataFilterProperty TItem="StockDto" Property="ProductCode" Title="Product Code"/>
            <RadzenDataFilterProperty TItem="StockDto" Property="Vendor.Name" Title="Vendor" FilterValue="@selectedVendor"
            Type="typeof(string)" FilterOperator="FilterOperator.Equals">
                <FilterTemplate>
                    <RadzenDropDown @bind-Value="@selectedVendor" Style="width: 100%;" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" AllowFiltering="true" Placeholder="Select..."
                    Change="@OnSelectedVendorChange" Data="@(_vendorsDto.Select(v => v.Name).ToList())" Multiple="false" AllowClear="true"/>
                </FilterTemplate>
            </RadzenDataFilterProperty>
            <RadzenDataFilterProperty TItem="StockDto" Property="Quantity" Title="Quantity" />
            <RadzenDataFilterProperty TItem="StockDto" Property="UnitPrice" Title="Unit Price" />
        </Properties>
    </RadzenDataFilter>
</RadzenCard>

<RadzenButton Icon="add_circle_outline" style="margin-bottom: 10px" Text="Add New Stock" Click="@InsertRow" Disabled="@(_stockToInsert != null)" Size="ButtonSize.Small" />
<RadzenButton Text="Export XLS" Icon="grid_on" Click="@(args => Export())" ButtonStyle="ButtonStyle.Secondary" Size="ButtonSize.Small" Class="mb-1" />

<RadzenDataGrid @ref="_grid" AllowPaging="true" AllowSorting="true" Data="@(filteredStocks ?? stockDto)" TItem="StockDto" ShowPagingSummary="true" AllowColumnResize="true"
Style="width: calc(100vw - 100px);" PageSize="20" GridLines="DataGridGridLines.Both" EditMode="DataGridEditMode.Single" RowUpdate="@OnUpdateRow" RowCreate="@OnCreateRow">

    <Columns>
        <RadzenDataGridColumn TItem="StockDto" Property="ProductCode" Title="Product Code" Width="150px" OrderIndex="1">
            <EditTemplate Context="edit">
                <RadzenTextBox @bind-Value="edit.ProductCode" Style="width: 100%; display: block" Name="ProductCode" />
                <RadzenRequiredValidator Text="Product Code is Required!" Component="ProductCode" Popup="true" Style="position: absolute; z-index: 9999;" />
            </EditTemplate>
        </RadzenDataGridColumn>
        <RadzenDataGridColumn TItem="StockDto" Property="Vendor.Name" Title="Vendor" Width="220px" OrderIndex="2">
            <EditTemplate Context="edit">
                <RadzenDropDownDataGrid TValue="int" AllowFiltering="true" AllowClear="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" FilterOperator="StringFilterOperator.Contains"
                Data=@_vendorsDto Count="5" TextProperty="Name" ValueProperty="Id"
                Class="w-100" @bind-Value="edit.VendorId" Name="vendor" id="vendor" />
                <RadzenNumericRangeValidator Component="vendor" Min="1" Text="Vendor is Required!" Popup=true Style="position: absolute; z-index: 9999;" />
            </EditTemplate>
        </RadzenDataGridColumn>
        <RadzenDataGridColumn TItem="StockDto" Property="Quantity" Title="Quantity" Width="80px" OrderIndex="3">
            <EditTemplate Context="edit">
                <RadzenNumeric TValue="int" Min="1" @bind-Value="edit.Quantity" Style="width: 100%; display: block" Name="Quantity"/>
                <RadzenNumericRangeValidator Component="Quantity" Min="1" Text="Quantity must be greater than zero!" Popup=true Style="position: absolute; z-index: 9999;" />
            </EditTemplate>
        </RadzenDataGridColumn>
        <RadzenDataGridColumn TItem="StockDto" Property="UnitPrice" Title="Unit Price" Width="80px" OrderIndex="4">
            <EditTemplate Context="edit">
                <RadzenNumeric TValue="double" Min="0" @bind-Value="edit.UnitPrice" Style="width: 100%; display: block" Name="UnitPrice"/>
                <RadzenNumericRangeValidator Component="UnitPrice" Min="1" Text="Price must be greater than zero!" Popup=true Style="position: absolute; z-index: 9999;" />
            </EditTemplate>
        </RadzenDataGridColumn>
        <RadzenDataGridColumn TItem="StockDto" Context="stock" Filterable="false" Sortable="false" TextAlign="TextAlign.Center" Width="55px">
            <Template Context="stock">

                <RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => EditRow(stock))" @onclick:stopPropagation="true" Size="ButtonSize.Small">
                </RadzenButton>

            </Template>
            <EditTemplate Context="stock">
                <RadzenButton Icon="check" ButtonStyle="ButtonStyle.Primary" Class="m-1" Click="@(args => SaveRow(stock))" @onclick:stopPropagation="true" Size="ButtonSize.Small">
                </RadzenButton>
                <RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Class="m-1" Click="@(args => CancelEdit(stock))" Size="ButtonSize.Small">
                </RadzenButton>
                <RadzenButton Icon="delete" ButtonStyle="ButtonStyle.Danger" Class="m-1" Click="@(args => ShowInlineDialogStock(stock))" Size="ButtonSize.Small">
                </RadzenButton>
            </EditTemplate>
        </RadzenDataGridColumn>
    </Columns>
</RadzenDataGrid>

@code {
    IEnumerable<StockDto> stockDto;
    RadzenDataGrid<StockDto> _grid;
    StockDto? _stockToInsert;
    IQueryable<StockDto?>? filter;
    IQueryable<IMS.CoreBusiness.Stock?> stock;
    IQueryable<StockDto?> stocksDto;
    bool busyStockExcelExport;
    IEnumerable<VendorDto?> _vendorsDto;
    IEnumerable<Vendor?> _vendors;

    IMS.CoreBusiness.Stock stockMap;
    RadzenDataFilter<StockDto> dataFilter;
    IEnumerable<StockDto> filteredStocks;
    string selectedVendor;
    

    void OnSelectedVendorChange(object value)
    {
        if (selectedVendor != null && !selectedVendor.Any())
        {
            selectedVendor = null;
        }
        
    }

    protected override async Task OnInitializedAsync()
    {
        try
        {
            stock = ViewStocksUseCase.Execute();

            stockDto = Mapper.ProjectTo<StockDto>(stock).ToList();

          
            filteredStocks = stockDto.ToList();
           
            _vendors = await ViewAllVendorsUseCase.ExecuteAsync();
            _vendorsDto = Mapper.Map(_vendors, _vendorsDto); 


            await dataFilter.AddFilter(new CompositeFilterDescriptor()
            {
                Property = "ProductCode",
                FilterOperator = FilterOperator.Contains
            });
            await dataFilter.AddFilter(new CompositeFilterDescriptor()
            {
                Property = "Vendor.Name",
                FilterOperator = FilterOperator.Equals
            });
            await dataFilter.AddFilter(new CompositeFilterDescriptor()
            {
                Property = "Quantity",
                FilterOperator = FilterOperator.Equals
            });
            await dataFilter.AddFilter(new CompositeFilterDescriptor()
            {
                Property = "UnitPrice",
                FilterOperator = FilterOperator.Equals
            });
        }
        catch (Exception e)
        {
            _logger.LogError(e.Message);
            Console.WriteLine(e);
        }
    }

    private async Task InsertRow()
    {
        _stockToInsert = new StockDto();
        
        await _grid.InsertRow(_stockToInsert);


    }

    async Task EditRow(StockDto? stock)
    {
        await _grid.EditRow(stock);
    }

    async Task SaveRow(StockDto? stock)
    {
        await _grid.UpdateRow(stock);

        if (stock.VendorId > 0)
        {
            if (stock == _stockToInsert)
            {
                _stockToInsert = null;
            }
        }

    }

    private async Task OnCreateRow(StockDto? stock)
    {
        if (stock != null)
        {
            stockMap = new CoreBusiness.Stock();
            Mapper.Map(stock, stockMap);

            var addedStock = await AddStockUseCase.ExecuteAsync(stockMap);

            Mapper.Map(addedStock, stock);
            await _grid.UpdateRow(stock);
        }

    }

    private async Task OnUpdateRow(StockDto stock)
    {
        if (stock == _stockToInsert)
        {
            _stockToInsert = null;
        }

        if (stock != null)
        {
            stockMap = new CoreBusiness.Stock();
            Mapper.Map(stock, stockMap);

            var updatedStock = await UpdateStocksUseCase.ExecuteAsync(stockMap);

            Mapper.Map(updatedStock, stock);
            await _grid.UpdateRow(stock);
        }
    }

    private async Task Export()
    {
        busyStockExcelExport = true;
        filter = _grid.View;

        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        var stream = new MemoryStream();

        using (var package = new ExcelPackage(stream))
        {
            var workSheet = package.Workbook.Worksheets.Add("Stocks");

            var recordIndex = 2;

            workSheet.Row(1).Style.Font.Bold = true;
            var headerCells = workSheet.Cells["A1:D1"];
            headerCells.Style.Font.Bold = true;
            headerCells.Style.Font.Size = 13;
            headerCells.Style.Border.BorderAround(ExcelBorderStyle.Thin);
            headerCells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Font.Color.SetColor(System.Drawing.Color.Black);
            headerCells = workSheet.Cells["A1:D1"];
            // Set their background color to DarkBlue.
            headerCells.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
            headerCells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);

            workSheet.Cells[1, 1].Value = "Product Code";
            workSheet.Cells[1, 2].Value = "Vendor";
            workSheet.Cells[1, 3].Value = "Quantity";
            workSheet.Cells[1, 4].Value = "Unit Price";


            foreach (var stock in filter)
            {

                workSheet.Cells[recordIndex, 1].Value = stock.ProductCode;
                workSheet.Cells[recordIndex, 2].Value = stock.Vendor.Name;
                workSheet.Cells[recordIndex, 3].Value = stock.Quantity;
                workSheet.Cells[recordIndex, 4].Value = stock.UnitPrice;

                recordIndex++;
               
            }


            //Make all text fit the cells
            workSheet.Cells[workSheet.Dimension.Address].AutoFitColumns();
            await package.SaveAsync();
        }
        stream.Position = 0;
        var excelName = $"Stocks-{DateTime.Now.ToString("ddMMyyyyHHmm")}.xlsx";


        using var streamRef = new DotNetStreamReference(stream: stream);

        await JS.InvokeVoidAsync("downloadFileFromStream", excelName, streamRef);
        busyStockExcelExport = false;
    }

    private async Task CancelEdit(StockDto? stock)
    {
        if (stock == _stockToInsert)
        {
            _stockToInsert = null;
        }
        //Order Check
        if (stock.Id > 0)
        {
            var stockOriginal = await CancelStockUseCase.Execute(stock);
            Mapper.Map(stockOriginal, stock);
        }


        _grid.CancelEditRow(stock);
        await _grid.Reload();
    }

    async Task ShowInlineDialogStock(StockDto stock)
    {
        var result = await DialogService.OpenAsync("Delete Stock", ds =>
            @<div>
                <p class="mb-4">Do you want to delete Stock ID <b>@stock.Id</b>, Product Code: <b>@stock.ProductCode</b>?</p>
                <div class="row">
                    <div class="col">
                        <RadzenButton Text="Ok" Click="() => ds.Close(true)" Class="mr-1" Style="width: 80px;" />
                        <RadzenButton Text="Cancel" Click="() => ds.Close(false)" ButtonStyle="ButtonStyle.Light" Class="mr-1" />
                    </div>
                </div>
            </div>
        );

        if (result == null)
        {
            CancelEdit(stock);
        }
        else if (result)
        {
            await DeleteStock(stock);
        }
        else
        {
            CancelEdit(stock);
        }
    }

    async Task DeleteStock(StockDto stocks)
    {
        stockMap = new CoreBusiness.Stock();
        Mapper.Map(stocks, stockMap);
        await DeleteStockUseCase.ExecuteAsync(stockMap.Id);
        stock = ViewStocksUseCase.Execute();

        stockDto = Mapper.ProjectTo<StockDto>(stock);

        await _grid.Reload();
    }

    
}

Data Filter Video

I figured it out :slight_smile:

void OnSelectedVendorChange(object value)
{
    if (value == null)
    {
        filteredStocks = null;
    }
    
}