Immaginiamo di aver creato la nostra applicazione Blazor con una QuickGrid che visualizzi dati variabili nel tempo. Potrebbe trattarsi di quotazioni in borsa, come negli esempi che abbiamo realizzato negli scorsi script, oppure semplicemente essere dovuto alla concorrenza, con altri utenti che manipolano le stesse entità.
In ogni caso ci troviamo in un contesto in cui vogliamo effettuare il refresh dei dati nella QuickGrid a causa di un evento esterno, quindi non dopo l'interazione dell'utente, come abbiamo visto nei precedenti esempi.
La nostra pagina è dotata di una QuickGrid che, tramite un ItemsProvider, effettua chiamate a una API:
<QuickGrid class="table" ItemsProvider="@forecastsProvider" Pagination="@pagination"> <PropertyColumn Property="@(x => x.Date)" Format="yyyy-MM-dd" IsDefaultSortColumn="true" InitialSortDirection="SortDirection.Ascending" /> <PropertyColumn Property="@(x => x.Summary)" /> <PropertyColumn Property="@(x => x.TemperatureC)" /> <PropertyColumn Property="@(x => x.TemperatureF)" /> </QuickGrid> <Paginator State="@pagination" /> @code { private PaginationState pagination = new PaginationState() { ItemsPerPage = 10 }; private GridItemsProvider<WeatherForecast>? forecastsProvider; private ValueTask<GridItemsProviderResult<WeatherForecast>> GetItemsAsync(GridItemsProviderRequest<WeatherForecast> request) { // .. altro codice qui .. } protected override async Task OnInitializedAsync() { this.forecastsProvider = GetItemsAsync; } }
Per poter forzare un refresh dei dati, dobbiamo innanzitutto assegnare la griglia a una variabile (theGrid, nel nostro caso) tramite l'attributo Ref:
@implements IDisposable <QuickGrid ... @ref="theGrid"> ... </QuickGrid> <Paginator State="@pagination" /> @code { //.. altro codice qui .. private Timer _timer; private QuickGrid<WeatherForecast> theGrid; private GridItemsProvider<WeatherForecast>? forecastsProvider; protected override async Task OnInitializedAsync() { this.forecastsProvider = GetItemsAsync; _timer = new Timer(async _ => { await InvokeAsync(async () => { Console.WriteLine("Weather: Refreshing data"); await theGrid.RefreshDataAsync(); }); }, null, 0, 5000); } public void Dispose() { _timer.Dispose(); } }
Nel codice in alto, all'interno di OnInitializedAsync, creiamo un Timer che scatti ogni 5 secondi, nel cui metodo di callback invochiamo RefreshDataAsync di QuickGrid, che scatenerà un refresh dei dati.
Attenzione a due aspetti importanti: innanzitutto la chiamata RefreshDataAsync avviene all'interno di un InvokeAsync. Questo perché l'evento del Timer viene scatenato in un thread diverso da quello della UI, e, come avviene dai tempi di Windows Forms, ogni evento che genera una modifica dell'interfaccia deve essere scatenato nel thread UI.
Inoltre, l'intera pagina (o componente) implementa IDisposable, così da poter effettuare il dispose del timer ed evitare che questo continui a scatenare l'evento di callback anche dopo che l'utente abbia navigato via dalla pagina corrente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Estrarre dati randomici da una lista di oggetti in C#
Utilizzare gRPC su App Service di Azure
Ottimizzare le performance usando Span<T> e il metodo Split
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Creare una custom property in GitHub
Applicare un filtro per recuperare alcune issue di GitHub
Utilizzare WhenEach per processare i risultati di una lista di task
Paginare i risultati con QuickGrid in Blazor
Recuperare l'ultima versione di una release di GitHub
Utilizzare una qualunque lista per i parametri di tipo params in C#
Configurare e gestire sidecar container in Azure App Service
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database