3.5 KiB
title | description | type | page_title | slug | position | tags | ticketid | res_type |
---|---|---|---|---|---|---|---|---|
Force a Grid to Refresh | how to force a grid to refresh its data. | how-to | Refresh Grid Data | grid-force-refresh | 1448335 | kb |
Environment
Product | Grid for Blazor |
Description
Is there anyway say I can have a button click event cause a Grid to redraw?
I'm using manual data operations, how do I use an observable collection to refresh the grid?
Solution
There are two different cases:
Automatic operations
For general cases, to refresh the rendered data in the Grid, use an ObservableCollection
. To change the entire data collection, .Clear()
the collection first to notify the grid that this old data is gone, then create a new one with the new data.
If you don't use an ObservableCollection
, then [create a new
instance of the collection and set it to the Data
parameter]({%slug grid-refresh-data%}#new-collection-reference). A new
instance provides a new reference, which fires the OnParametersSet
event from the framework. This lets the Grid redraw. If you only add/remove items from the same collection, the reference to the entire data collection stays the same and the Grid is not notified of the change.
caption Refresh grid data with automatic data source operations
@* change grid data on external action.
Try grouping or filtering the grid, for example, then change its data through the button above it *@
<button @onclick="@ChangeGridData">change grid data</button>
<TelerikGrid Data="@MyData" Height="400px"
Pageable="true" Sortable="true" Groupable="true"
FilterMode="Telerik.Blazor.GridFilterMode.FilterRow"
Resizable="true" Reorderable="true">
<GridColumns>
<GridColumn Field="@(nameof(SampleData.Id))" Width="120px" />
<GridColumn Field="@(nameof(SampleData.Name))" Title="Employee Name" Groupable="false" />
<GridColumn Field="@(nameof(SampleData.Team))" Title="Team" />
<GridColumn Field="@(nameof(SampleData.HireDate))" Title="Hire Date" />
</GridColumns>
</TelerikGrid>
@code {
async Task ChangeGridData()
{
Random rnd = new Random();
var newData = Enumerable.Range(1, 30).Select(x => new SampleData
{
Id = x,
Name = "name " + rnd.Next(1, 100),
Team = "team " + rnd.Next(1, 100),
HireDate = DateTime.Now.AddDays(-rnd.Next(1, 100)).Date
});
// create a new collection to get a new reference
MyData = new List<SampleData>(newData);
}
public List<SampleData> MyData = Enumerable.Range(1, 30).Select(x => new SampleData
{
Id = x,
Name = "name " + x,
Team = "team " + x % 5,
HireDate = DateTime.Now.AddDays(-x).Date
}).ToList();
public class SampleData
{
public int Id { get; set; }
public string Name { get; set; }
public string Team { get; set; }
public DateTime HireDate { get; set; }
}
}
Manual operations
When using manual operations through the [OnRead event]({%slug common-features-data-binding-onread%}), call the component's [Rebind()
method]({%slug grid-refresh-data%}#rebind-method). This will force the component to fire its OnRead
event.