diff --git a/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs b/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs
index 7edf4f2..eb06c58 100644
--- a/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs
+++ b/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs
@@ -15,10 +15,18 @@ namespace AyCode.Blazor.Components.Components.Grids;
public interface IMgGridBase : IGrid
{
-
+ ///
+ /// Indicates whether any synchronization operation is in progress
+ ///
+ bool IsSyncing { get; }
+
+ ///
+ /// Event fired when synchronization state changes (true = syncing started, false = syncing ended)
+ ///
+ event Action? OnSyncingStateChanged;
}
-public abstract class MgGridBase : DxGrid, IMgGridBase
+public abstract class MgGridBase : DxGrid, IMgGridBase, IAsyncDisposable
where TSignalRDataSource : AcSignalRDataSource>
where TDataItem : class, IId
where TId : struct
@@ -29,11 +37,18 @@ public abstract class MgGridBase? _dataSourceParam = [];
private string _gridLogName;
+ ///
+ public bool IsSyncing => _dataSource?.IsSyncing ?? false;
+
+ ///
+ public event Action? OnSyncingStateChanged;
+
public MgGridBase() : base()
{
}
@@ -133,6 +148,7 @@ public abstract class MgGridBase args)
{
+ if (_isDisposed) return;
if (args.TrackingState is TrackingState.GetAll or TrackingState.None) return;
Logger.Debug($"{_gridLogName} OnDataSourceItemChanged; trackingState: {args.TrackingState}");
@@ -174,7 +203,7 @@ public abstract class MgGridBase(this, args.Item, args.TrackingState);
await OnGridItemChanged.InvokeAsync(changedEventArgs);
- if (!changedEventArgs.CancelStateChangeInvoke)
+ if (!changedEventArgs.CancelStateChangeInvoke && !_isDisposed)
{
//BeginUpdate();
await InvokeAsync(StateHasChanged); //TODO: bezárja a DetailRow-t! pl: az email-nél IsReaded=true update... - J.
@@ -184,6 +213,8 @@ public abstract class MgGridBase)
@@ -192,8 +223,11 @@ public abstract class MgGridBase : GridDataItemChangedEventArgs where TDataItem : class