Browse Source

Fixes to DynmaicGrid DirectEdit handling

Frank van den Bos 2 years ago
parent
commit
d718737b43
1 changed files with 66 additions and 16 deletions
  1. 66 16
      InABox.DynamicGrid/DynamicGrid.cs

+ 66 - 16
InABox.DynamicGrid/DynamicGrid.cs

@@ -508,10 +508,6 @@ namespace InABox.DynamicGrid
             Edit.Margin = new Thickness(0, 2, 2, 0);
             Edit.Click += Edit_Click;
 
-            /*MultiEdit = CreateButton(Properties.Resources.doc_xls.AsBitmapImage(Color.White));
-            MultiEdit.Margin = new Thickness(0, 2, 2, 0);
-            MultiEdit.Click += MultiEdit_Click;*/
-
             EditSpacer = new Label { Width = 5 };
 
             Print = CreateButton(Properties.Resources.print.AsBitmapImage(Color.White));
@@ -653,8 +649,7 @@ namespace InABox.DynamicGrid
 
             Add.Visibility = Options.Contains(DynamicGridOption.AddRows) ? Visibility.Visible : Visibility.Collapsed;
             Edit.Visibility = Options.Contains(DynamicGridOption.EditRows) ? Visibility.Visible : Visibility.Collapsed;
-            /*MultiEdit.Visibility =
-                Visibility.Collapsed; // _Options.Contains(DynamicGridOptions.DirectEdit) ? Visibility.Visible : Visibility.Collapsed;*/
+            
             EditSpacer.Visibility = Options.Contains(DynamicGridOption.AddRows) || Options.Contains(DynamicGridOption.EditRows)
                 ? Visibility.Visible
                 : Visibility.Collapsed;
@@ -744,7 +739,7 @@ namespace InABox.DynamicGrid
         {
             if (!Options.Contains(DynamicGridOption.DirectEdit))
                 return;
-            if (!DataGrid.SelectionController.CurrentCellManager.CurrentCell.IsEditing && e.ActivationTrigger == ActivationTrigger.Keyboard)
+            if ((DataGrid.SelectionController.CurrentCellManager.CurrentCell?.IsEditing != true) && e.ActivationTrigger == ActivationTrigger.Keyboard)
                 DataGrid.SelectionController.CurrentCellManager.BeginEdit();
         }
 
@@ -934,14 +929,15 @@ namespace InABox.DynamicGrid
 
         protected void UpdateCell(int row, string colname, object value)
         {
+            var datacolname = colname.Replace(".", "_");
             var table = DataGridItems;
-            var colno = table.Columns.IndexOf(colname);
+            var colno = table.Columns.IndexOf(datacolname);
             var corecol = Data.Columns[colno].ColumnName;
             var corerow = Data.Rows[row];
             corerow[corecol] = value;
 
             var datarow = table.Rows[row];
-            datarow[colname] = value;
+            datarow[datacolname] = value;
         }
 
         private void DataGrid_CurrentCellEndEdit(object? sender, CurrentCellEndEditEventArgs e)
@@ -951,7 +947,8 @@ namespace InABox.DynamicGrid
                 return;
             if (inplaceeditor is not null && bChanged) UpdateData(inplaceeditor, e.RowColumnIndex.ColumnIndex);
             bChanged = false;
-            inplaceeditor = null;
+            inplaceeditor = null; 
+            DataGridItems.AcceptChanges();
         }
 
         private void UpdateData(T obj, int columnindex)
@@ -959,6 +956,8 @@ namespace InABox.DynamicGrid
             var table = DataGridItems;
 
             var iRow = SelectedRows.First().Index; //e.RowColumnIndex.RowIndex - (Options.Contains(DynamicGridOptions.FilterRows) ? 2 : 1);
+            if (iRow > table.Rows.Count)
+                return;
             var row = table.Rows[iRow];
             var colname = DataGrid.Columns[columnindex].MappingName;
             var value = row[colname];
@@ -968,18 +967,46 @@ namespace InABox.DynamicGrid
             var corerow = Data.Rows[iRow];
             corerow[corecol] = value;
 
-            CoreUtils.SetPropertyValue(obj, corecol, value);
+            Dictionary<String, object> changes = new Dictionary<string, object>();
+            if (DataGrid.Columns[colname] is GridComboBoxColumn combo)
+            {
+
+                var prefix = String.Join(".",corecol.Split(".").Reverse().Skip(1).Reverse());
+                var field = corecol.Split(".").Last();             
+                var lookups = (combo.ItemsSource as DataView)?.Table;
+                if (lookups != null)
+                {
+                    var lookuprow = lookups.AsEnumerable().FirstOrDefault(x => x[field] == value);
+                    if (lookuprow != null)
+                    {
+                        foreach (DataColumn lookupcol in lookups.Columns)
+                        {
+                            var prop = String.Join(".", new String[] { prefix, lookupcol.ColumnName });
+                            DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, prop, lookuprow[lookupcol], changes);
+                            //CoreUtils.SetPropertyValue(obj, prop, lookuprow[lookupcol]);
+                        }
+                    }
+                }
+            }
+            else
+                DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, corecol, value, changes);
+                //CoreUtils.SetPropertyValue(obj, corecol, value);
+
+
             SaveItem(obj);
-            Data.LoadRow(corerow, obj);
+            foreach (var key in changes.Keys)
+                UpdateCell(iRow, key, changes[key]);
+            //Data.LoadRow(corerow, obj);
 
             foreach (var column in Data.Columns.Where(x => !string.Equals(corecol, x.ColumnName)))
             {
                 var scol = column.ColumnName.Replace('.', '_');
-                row[scol] = corerow[column.ColumnName];
+                row[scol] = corerow[column.ColumnName] ?? DBNull.Value;
             }
 
             for (var i = 0; i < ActionColumns.Count; i++) 
                 row[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(corerow);
+            
         }
 
         private void DataGrid_QueryRowHeight(object? sender, QueryRowHeightEventArgs e)
@@ -1692,7 +1719,6 @@ namespace InABox.DynamicGrid
                         lookupcol.SelectedValuePath = table.Columns[0].ColumnName;
                         lookupcol.DisplayMemberPath = "Display";
                         lookupcol.ItemsSource = table.DefaultView;
-
                         newcol = lookupcol;
                     }
                     else
@@ -2065,7 +2091,7 @@ namespace InABox.DynamicGrid
 
         //IncrementalList<T> _data = null;
 
-        private void InvalidateRow(CoreRow row)
+        protected void InvalidateRow(CoreRow row)
         {
             var rowdata = new List<object?>(row.Values);
             foreach (var ac in ActionColumns)
@@ -2402,7 +2428,30 @@ namespace InABox.DynamicGrid
 
         private void Add_Click(object sender, RoutedEventArgs e)
         {
-            DoAdd();
+            if (Options.Contains(DynamicGridOption.DirectEdit))
+            {
+                if (!CanCreateItems())
+                    return;
+                
+                var item = CreateItem();
+                SaveItem(item);
+                
+                var datarow = Data.NewRow();
+                ObjectToRow(item, datarow);
+                Data.Rows.Add(datarow);
+                
+                var masterrow = MasterData.NewRow();
+                ObjectToRow(item, masterrow);
+                MasterData.Rows.Add(masterrow);
+                
+                _recordmap[datarow] = masterrow;
+                
+                InvalidateGrid();
+                SelectedRows = new[] { datarow };
+                OnChanged?.Invoke(this);
+            }
+            else
+                DoAdd();
         }
         public virtual DynamicEditorPages LoadEditorPages(T item)
         {
@@ -2418,6 +2467,7 @@ namespace InABox.DynamicGrid
 
         public virtual void LoadEditorButtons(T item, DynamicEditorButtons buttons)
         {
+            buttons.Clear();
             buttons.Add(
                 "",
                 Properties.Resources.help.AsBitmapImage(),