Преглед изворни кода

Added UI support for database paging
Preliminary fix for inconsistencies with database paging

frogsoftware пре 11 месеци
родитељ
комит
4f1a7bf88d
2 измењених фајлова са 41 додато и 7 уклоњено
  1. 22 4
      inabox.wpf/DynamicGrid/DynamicDataGrid.cs
  2. 19 3
      inabox.wpf/DynamicGrid/DynamicGrid.cs

+ 22 - 4
inabox.wpf/DynamicGrid/DynamicDataGrid.cs

@@ -5,6 +5,7 @@ using System.Drawing;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
@@ -162,6 +163,15 @@ public class DynamicDataGrid<TEntity> : DynamicGrid<TEntity>, IDynamicDataGrid w
     
     public event OnReloadEventHandler? OnReload;
 
+    protected bool IsPaging { get; private set; } = false;
+
+    protected override string FormatRecordCount()
+    {
+        return IsPaging 
+            ? $"{base.FormatRecordCount()} (loading..)"
+            : base.FormatRecordCount();
+    }
+
     protected override void Reload(Filters<TEntity> criteria, Columns<TEntity> columns, ref SortOrder<TEntity>? sort,
         Action<CoreTable?, Exception?> action)
     {
@@ -173,20 +183,26 @@ public class DynamicDataGrid<TEntity> : DynamicGrid<TEntity>, IDynamicDataGrid w
             var inSort = sort;
             Task.Run(() =>
             {
+                
                 var page = CoreRange.Database(Options.PageSize);
                 var filter = criteria.Combine();
-
+                
+                IsPaging = true;
                 while (true)
                 {
+                    
                     try
                     {
                         var data = Client.Query(filter, columns, inSort, page);
                         data.Offset = page.Offset;
+                        IsPaging = data.Rows.Count == page.Limit;
                         action(data, null);
-                        if (data.Rows.Count < page.Limit)
-                        {
+                        if (!IsPaging)
                             break;
-                        }
+                        
+                        // Proposal - Let's slow it down a bit to enhance UI responsiveness?
+                        Thread.Sleep(100);
+                        
                         page.Next();
                     }
                     catch (Exception e)
@@ -195,6 +211,8 @@ public class DynamicDataGrid<TEntity> : DynamicGrid<TEntity>, IDynamicDataGrid w
                         break;
                     }
                 }
+
+                
             });
         }
         else

+ 19 - 3
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -30,6 +30,7 @@ using SolidColorBrush = System.Windows.Media.SolidColorBrush;
 using String = System.String;
 using VerticalAlignment = System.Windows.VerticalAlignment;
 using VirtualizingCellsControl = Syncfusion.UI.Xaml.Grid.VirtualizingCellsControl;
+using System.Threading;
 
 namespace InABox.DynamicGrid;
 
@@ -487,9 +488,12 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
 
     void IDynamicGridUIComponentParent<T>.UpdateRecordCount(int count)
     {
-        Count.Content = string.Format("{0} Records", count);
+        Count.Content = string.Format(FormatRecordCount(), count);
     }
 
+    protected virtual string FormatRecordCount() => "{0} Records";
+    
+
     void IDynamicGridUIComponentParent<T>.LoadColumnsMenu(ContextMenu menu)
     {
         menu.AddItem("Select Columns", null, SelectColumnsClick);
@@ -1243,6 +1247,8 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
             }
         return newRows;
     }
+    
+    private readonly SemaphoreSlim semaphore = new(1,1);
 
     private void LoadData(RowRange? range)
     {
@@ -1261,8 +1267,18 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         }
         else
         {
-            var newRows = FilterRows(Enumerable.Range(range.RowIdx, range.Size).Select(i => MasterData.Rows[i]), Data, _recordmap);
-            UIComponent.AddPage(newRows);
+            semaphore.Wait();
+            try
+            {
+                // This throws errors when overalpping refreshes cause a mismatch between MasterData and range
+                // Using try/finally and a Semaphore as a temporary measure until we can isolate the issue
+                var _newRows = FilterRows(Enumerable.Range(range.RowIdx, range.Size).Select(i => MasterData.Rows[i]), Data, _recordmap);
+                UIComponent.AddPage(_newRows);
+            }
+            finally
+            {
+                semaphore.Release();
+            }
         }
     }