Radzen DataGrid and load/save settings

Hi!

I have a Blazor page where I use DataGrid settings. When user open page previous settings are loaded like it should.

I have built a function as a Blazor component where user can save different presets of settings (column order, visibility, filter and so on).

When user open the page its getting the settings from localStorage. If this localStorage are the same as a saved preset my component change the dropdown to the name of the saved preset.

After the page are loaded and I chose another presets (first try), my "settings" are restored to default/original datagrid value and my dropdown selected value gets null/empty. If I try to select a preset again, then the preset are loaded like it should.

My component that can save / load presets :

<RadzenDropDownDataGrid @bind-Value=@selectedValue Data=@SettingsList TextProperty="Name" ValueProperty="Id" Change="@OnSelectedValueChange" PageSize="20" />

protected override async Task OnInitializedAsync()
{
    SettingsList = await UserRepository.GetUserSettingsAsync(UserId, Property, true);

    await base.OnInitializedAsync();
}

protected override void OnParametersSet()
{
    var selectedItem = SettingsList.FirstOrDefault(p => p.Value == Settings);

    if (selectedItem == null)
    {
        selectedValue = null;
    }
    else
    {
        selectedValue = selectedItem.Id;
    }
}

private async Task OnSelectedValueChange(object value)
{
    selectedValue = (int?)value;
    Settings = SettingsList.Where(p => p.Id == selectedValue).Select(s => s.Value).FirstOrDefault();
    await SettingsChanged.InvokeAsync(Settings);
}

And my parent :

<UserSettingsHelper Property="OFFERTLIST" @bind-Settings="@gridSet" @bind-Settings:after="()=>UpdateSettings()" UserId="@userState.UserItem.Id" />

<RadzenDataGrid @ref="minGrid" @bind-Settings="@Settings" Style="@Style" Data="@projectList" TItem="OffertListDTO" ColumnWidth="300px" Density="Density.Compact"
AllowSorting="true" AllowFiltering="true" FilterMode="FilterMode.Simple" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" AllowColumnReorder="true"
AllowVirtualization="true" AllowColumnResize="true" @key="@KeySettings"
ExpandMode="DataGridExpandMode.Single" RowRender="@RowRender" CellRender="@CellRender" AllowColumnPicking=true>

async Task UpdateSettings()
{
    try
    {
        List<string> currentSelectedSaljare = selectedSaljare.ToList();

        DataGridSettings loadedSettings = new DataGridSettings();

        if (gridSet != "")
        {
            if (!LoadingFirst)
            {
                loadedSettings = JsonSerializer.Deserialize<DataGridSettings>(gridSet);
            }
            else
            {
                loadedSettings = Settings;
            }
        }
        else
        {
            loadedSettings = Settings;
        }

// some other code that set som external filter but are not running when presetloading / localStorage are triggering this method.

Settings = loadedSettings;

selectedSaljare = currentSelectedSaljare.ToList();
KeySettings = !KeySettings;

StateHasChanged();

KeySettings = !KeySettings;

await Task.CompletedTask;

}

If I don't have KeySettings = !KeySettings twice and a StateHasChanged(); between I don't get first load from localStorage when page are loaded.

public DataGridSettings Settings
{
    get
    {
        return _settings;
    }
    set
    {
        if (_settings != value)
        {
            _settings = value;

            string originalSettingsJson = JsonSerializer.Serialize(_settings);

            var kolumn = _settings.Columns.FirstOrDefault(p => p.Property == "TypeCode");
            if (kolumn != null)
            {
                kolumn.FilterValue = null;
            }
            gridSet = JsonSerializer.Serialize<DataGridSettings>(_settings);

            _settings = JsonSerializer.Deserialize<DataGridSettings>(originalSettingsJson);

// Don't save data to localStorage if it's just fetched from localStorage
if (!LoadSettings)
{
InvokeAsync(SaveStateAsync);
}
LoadSettings = false;
}
}
}

I guess there are some problems with my KeySettings .. StateHasChanged .. KeySettings that make things failure when page are newly loaded.

I’m afraid that only debugging can show what’s going on.

Finally I found a solution, add some code that logged when methods start / end and who's calling for them.

So, this code :

Settings = loadedSettings;
KeySettings = !KeySettings;
StateHasChanged();
KeySettings = !KeySettings;

Are now change to :

StateHasChanged() // update my grids data, but clear viewsettings, why?
Settings = copysettings(loadedSettings); // don't update gridview
KeySettings = !KeySettings; // force mygrid to update view