Thank's for your reponses.
I still searching a solution for the problem and after some tests, it's appear that grid with a Count property set to a big value have some flashes or incoherent behaviors.
I have use the online demo without any customisation, I only add my load on demand algorithm.
The grid with 500 k elements is working on Microsoft Edge but not on Mozilla, you can switch (click multiple time or refresh the page if it doesn't work) to small one grid (1500 elements) and the grid will fork fine also with Mozilla.
I have join my code, do you see any error in my code that can be the cause ?
Thank you very much 
Best regards,
Yanis.
@page "/demo-radzen"
<RadzenButton Click="SwitchMode">Switch of mode</RadzenButton>
@if (FlashMob)
{
<p> In the current configuration (500000 OrderDetails) the grid will flash (on Mozilla Firefox). </p>
}
else
{
<p> In the current configuration (1500 OrderDetails) the grid will work fine.</p>
}
<RadzenDataGrid Data="@_orderDetailsDisplayed"
LoadData="LoadData"
Count="_allOrderDetails.Count()"
TItem="OrderDetail"
AllowVirtualization="true"
Style="height:400px"
AllowFiltering="true"
FilterPopupRenderMode="PopupRenderMode.OnDemand"
FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
LogicalFilterOperator="LogicalFilterOperator.Or"
AllowSorting="true">
<Columns>
<RadzenDataGridColumn TItem="OrderDetail" Property="OrderID" Title="OrderID" />
<RadzenDataGridColumn TItem="OrderDetail" Property="ProductID" Title="ProductID" />
<RadzenDataGridColumn TItem="OrderDetail" Property="UnitPrice" Title="Unit Price">
<Template Context="detail">
@String.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", detail.UnitPrice)
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderDetail" Property="Quantity" Title="Quantity" />
<RadzenDataGridColumn TItem="OrderDetail" Property="Discount" Title="Discount">
<Template Context="detail">
@String.Format("{0}%", detail.Discount * 100)
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
@code {
private IEnumerable<OrderDetail> _allOrderDetails = GetAListOfOrderDetail(500000); // See this as a database
private Dictionary<int, List<OrderDetail>> _cachedOrderDetails = new Dictionary<int, List<OrderDetail>>(); // The data already fetch
private IEnumerable<OrderDetail> _orderDetailsDisplayed;
public bool IsBusy = false;
public bool FlashMob = true;
public int PageSize = 100;
protected override void OnInitialized()
{
_orderDetailsDisplayed = GetOrderDetailsOnDemand(0, PageSize);
base.OnInitialized();
}
public void SwitchMode()
{
FlashMob = !FlashMob;
_allOrderDetails = GetAListOfOrderDetail(FlashMob ? 500000 : 1500);
_cachedOrderDetails = new Dictionary<int, List<OrderDetail>>();
_orderDetailsDisplayed = GetOrderDetailsOnDemand(0, PageSize);
StateHasChanged();
}
private async void LoadData(LoadDataArgs args)
{
_orderDetailsDisplayed = GetOrderDetailsOnDemand(args.Skip.Value, args.Top.Value);
if(_orderDetailsDisplayed.Count() > 0)
Console.WriteLine($"Display from ID {_orderDetailsDisplayed.Min(order => order.OrderID)} to {_orderDetailsDisplayed.Max(order => order.OrderID)}");
StateHasChanged();
}
public List<OrderDetail> GetOrderDetailsOnDemand(int startPos, int elementToTake)
{
var fetchOrderDetails = new List<OrderDetail>();
int startPage = GetStartPage(startPos);
int endPage = GetEndPage(startPos, elementToTake);
for (int pageToExplore = startPage; pageToExplore <= endPage; pageToExplore++)
{
if (_cachedOrderDetails.ContainsKey(pageToExplore))
{
fetchOrderDetails.AddRange(_cachedOrderDetails[pageToExplore]);
}
else
{
if (IsBusy) continue;
IsBusy = true;
List<OrderDetail> result = FetchData(pageToExplore, PageSize);
fetchOrderDetails.AddRange(result);
_cachedOrderDetails.Add(pageToExplore, result);
IsBusy = false;
}
}
return fetchOrderDetails.Skip(startPos - (startPage - 1) * PageSize).Take(elementToTake).ToList();
}
public List<OrderDetail> FetchData(int pageNumber, int pageSize)
{
//Replace by database fetching
return _allOrderDetails.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
}
private int GetStartPage(int startPos)
{
int startPage = (int)Math.Ceiling((decimal)startPos / PageSize);
if (Math.DivRem(startPos, PageSize).Remainder.Equals(0))
{
startPage++;
}
if (startPos.Equals(0))
{
startPage = 1;
}
return startPage;
}
private int GetEndPage(int startPos, int elementToTake)
{
int endPage = (int)Math.Ceiling((decimal)(startPos + elementToTake - 1) / PageSize);
if (Math.DivRem(startPos + elementToTake - 1, PageSize).Remainder.Equals(0))
{
endPage++;
}
return endPage;
}
#region Generate a list
public static List<OrderDetail> GetAListOfOrderDetail(int limit)
{
var orderDetailsGenerated = new List<OrderDetail>();
for (int i = 0; i < limit; i++)
{
orderDetailsGenerated.Add(GenerateOrderDetail(i));
}
return orderDetailsGenerated;
}
public static OrderDetail GenerateOrderDetail(int id)
{
Random random = new Random();
int productId = random.Next(1, 51);
int quantity = random.Next(10, 71);
double unitPrice = random.NextDouble() * 50 + 1;
double discount = random.NextDouble();
return new OrderDetail(id, productId, unitPrice, quantity, discount);
}
public class OrderDetail
{
public int OrderID { get; set; }
public int ProductID { get; set; }
public double UnitPrice { get; set; }
public int Quantity { get; set; }
public double Discount { get; set; }
public OrderDetail()
{
}
public OrderDetail(int orderId, int productId, double unitPrice, int quantity, double discount)
{
OrderID = orderId;
ProductID = productId;
UnitPrice = unitPrice;
Quantity = quantity;
Discount = discount;
}
}
#endregion
}