Explorar o código

Fixing update row to also update cell changes. Fixing really dumb lookup bug that probably used to work before the Lookup overhaul, but wasn't very good now. Made CoreRow Ienumerable

Kenric Nugteren hai 1 ano
pai
achega
e22ea825d0

+ 25 - 1
InABox.Core/CoreTable/CoreRow.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
@@ -6,7 +7,7 @@ using System.Linq.Expressions;
 namespace InABox.Core
 {
     [Serializable]
-    public class CoreRow : ICoreRow
+    public class CoreRow : ICoreRow, IEnumerable<KeyValuePair<string, object?>>
     {
         #region Fields
 
@@ -302,6 +303,29 @@ namespace InABox.Core
             return -1;
         }
 
+        #region IEnumerable
+
+        public IEnumerable<KeyValuePair<string, object?>> Entries
+        {
+            get
+            {
+                var columns = Table.Columns;
+                for (var i = 0; i < columns.Count; i++)
+                {
+                    var column = columns[i];
+                    var value =  i < Values.Count
+                        ? Values[i]
+                        : CoreUtils.GetDefault(column.DataType);
+                    yield return new KeyValuePair<string, object?>(column.ColumnName, value);
+                }
+            }
+        }
+
+        public IEnumerator<KeyValuePair<string, object?>> GetEnumerator() => Entries.GetEnumerator();
+
+        IEnumerator IEnumerable.GetEnumerator() => Entries.GetEnumerator();
+
+        #endregion
     }
 
     public static class CoreRowExtensions

+ 3 - 1
inabox.wpf/DynamicGrid/Columns/EditorColumns/DynamicGridComboBoxColumn.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Data;
 using InABox.Core;
 using Syncfusion.UI.Xaml.Grid;
@@ -13,6 +14,7 @@ public abstract class DynamicGridComboBoxColumn<TEntity, TEditor> : DynamicGridE
 {
     private List<Tuple<object?, string>> GetData(TEditor editor)
     {
+        var keycol = Definition.ColumnName.Split('.').Last();
         var data = editor.Values(typeof(TEntity), Definition.ColumnName, null);
 
         var items = new List<Tuple<object?, string>>
@@ -20,7 +22,7 @@ public abstract class DynamicGridComboBoxColumn<TEntity, TEditor> : DynamicGridE
             new(null, "")
         };
         foreach (var row in data.Rows)
-            items.Add(new(row[data.Columns[0].ColumnName], (row["Display"] ?? "").ToString() ?? ""));
+            items.Add(new(row[keycol], (row["Display"] ?? "").ToString() ?? ""));
         return items;
     }
 

+ 6 - 7
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -956,14 +956,13 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
 
     private void EntityChanged(T obj, CoreRow row, string changedColumn, Dictionary<string, object?> changes)
     {
-        OnAfterEditorValueChanged(null, new T[] { obj }, new AfterEditorValueChangedArgs(changedColumn, changes), changes);
+        OnAfterEditorValueChanged(null, [obj], new AfterEditorValueChangedArgs(changedColumn, changes), changes);
 
         SaveItem(obj);
 
         foreach (var (key, value) in changes)
         {
             row[key] = value;
-            UIComponent.UpdateCell(row,key,value);
         }
 
         UIComponent.UpdateRow(row);
@@ -1464,10 +1463,10 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         }
     }
 
-    protected void CreateItems(Func<IEnumerable<T>> create)
+    protected void CreateItems(Func<IEnumerable<T>>? create)
     {
-        List<CoreRow> newrows = new List<CoreRow>();
-        var items = create?.Invoke() ?? new T[] { CreateItem() };
+        var newRows = new List<CoreRow>();
+        var items = create?.Invoke() ?? CoreUtils.One(CreateItem());
         foreach (var item in items)
         {
             if (!AfterCreate(item))
@@ -1477,7 +1476,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
             var datarow = Data.NewRow();
             ObjectToRow(item, datarow);
             Data.Rows.Add(datarow);
-            newrows.Add(datarow);
+            newRows.Add(datarow);
 
             var masterrow = MasterData.NewRow();
             ObjectToRow(item, masterrow);
@@ -1487,7 +1486,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         }
 
         InvalidateGrid();
-        SelectedRows = newrows.ToArray();
+        SelectedRows = newRows.ToArray();
         OnChanged?.Invoke(this, EventArgs.Empty);
     }
 

+ 10 - 1
inabox.wpf/DynamicGrid/UIComponent/DynamicGridGridUIComponent.cs

@@ -1106,8 +1106,17 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
         var dataRow = GetDataRow(row);
         if(dataRow is not null)
         {
+            foreach(var (key, value) in row)
+            {
+                var datacolname = key.Replace(".", "_");
+                var dataValue = dataRow[datacolname];
+                if (!Equals(dataValue, value) && !(value is null && dataValue == DBNull.Value))
+                {
+                    dataRow[datacolname] = value ?? DBNull.Value;
+                }
+            }
             for (var i = 0; i < ActionColumns.Count; i++)
-                dataRow[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(row);
+                dataRow[$"ActionColumn{i}"] = ActionColumns[i].Data(row);
         }
     }