瀏覽代碼

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 1 年之前
父節點
當前提交
e22ea825d0

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

@@ -1,4 +1,5 @@
 using System;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Linq.Expressions;
@@ -6,7 +7,7 @@ using System.Linq.Expressions;
 namespace InABox.Core
 namespace InABox.Core
 {
 {
     [Serializable]
     [Serializable]
-    public class CoreRow : ICoreRow
+    public class CoreRow : ICoreRow, IEnumerable<KeyValuePair<string, object?>>
     {
     {
         #region Fields
         #region Fields
 
 
@@ -302,6 +303,29 @@ namespace InABox.Core
             return -1;
             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
     public static class CoreRowExtensions

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

@@ -1,5 +1,6 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Data;
 using System.Windows.Data;
 using InABox.Core;
 using InABox.Core;
 using Syncfusion.UI.Xaml.Grid;
 using Syncfusion.UI.Xaml.Grid;
@@ -13,6 +14,7 @@ public abstract class DynamicGridComboBoxColumn<TEntity, TEditor> : DynamicGridE
 {
 {
     private List<Tuple<object?, string>> GetData(TEditor editor)
     private List<Tuple<object?, string>> GetData(TEditor editor)
     {
     {
+        var keycol = Definition.ColumnName.Split('.').Last();
         var data = editor.Values(typeof(TEntity), Definition.ColumnName, null);
         var data = editor.Values(typeof(TEntity), Definition.ColumnName, null);
 
 
         var items = new List<Tuple<object?, string>>
         var items = new List<Tuple<object?, string>>
@@ -20,7 +22,7 @@ public abstract class DynamicGridComboBoxColumn<TEntity, TEditor> : DynamicGridE
             new(null, "")
             new(null, "")
         };
         };
         foreach (var row in data.Rows)
         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;
         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)
     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);
         SaveItem(obj);
 
 
         foreach (var (key, value) in changes)
         foreach (var (key, value) in changes)
         {
         {
             row[key] = value;
             row[key] = value;
-            UIComponent.UpdateCell(row,key,value);
         }
         }
 
 
         UIComponent.UpdateRow(row);
         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)
         foreach (var item in items)
         {
         {
             if (!AfterCreate(item))
             if (!AfterCreate(item))
@@ -1477,7 +1476,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
             var datarow = Data.NewRow();
             var datarow = Data.NewRow();
             ObjectToRow(item, datarow);
             ObjectToRow(item, datarow);
             Data.Rows.Add(datarow);
             Data.Rows.Add(datarow);
-            newrows.Add(datarow);
+            newRows.Add(datarow);
 
 
             var masterrow = MasterData.NewRow();
             var masterrow = MasterData.NewRow();
             ObjectToRow(item, masterrow);
             ObjectToRow(item, masterrow);
@@ -1487,7 +1486,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         }
         }
 
 
         InvalidateGrid();
         InvalidateGrid();
-        SelectedRows = newrows.ToArray();
+        SelectedRows = newRows.ToArray();
         OnChanged?.Invoke(this, EventArgs.Empty);
         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);
         var dataRow = GetDataRow(row);
         if(dataRow is not null)
         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++)
             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);
         }
         }
     }
     }